web-dev-qa-db-ja.com

%vを使用してintおよびstringを出力しないのはなぜですか

印刷することを知っていますint使用できます%d、およびstringを使用できます%sですが、%vで印刷します。だから私がいつも%vそれらを印刷しますか?これを行うとどのような問題が発生しますか?

19
harrycmfan

悪いことは起こりませんが、_%d_動詞は fmt パッケージに数値として(10を基数として)印刷するように指示し、_%v_動詞は上書きできるdefault形式を使用します。

次の例をご覧ください。

_type MyInt int

func (mi MyInt) String() string {
    return fmt.Sprint("*", int(mi), "*")
}

func main() {
    var mi MyInt = 2
    fmt.Printf("%d %v", mi, mi)
}
_

出力( Go Playground で試してください):

_2 *2*
_

_%v_動詞を使用する場合、fmtパッケージは、値が _fmt.Stringer_ インターフェース(単一のString() stringメソッド)を実装しているかどうかをチェックします)、そしてもしそうなら、そのメソッドは値をstringに変換するために呼び出されます(フラグが指定されている場合はさらにフォーマットされます)。

フォーマットルールの完全なリストは、関連する部分を引用して、fmtのパッケージドキュメントにあります。

動詞%Tおよび%pを使用して印刷する場合を除いて、特定のインターフェースを実装するオペランドには、特別なフォーマットの考慮事項が適用されます。アプリケーションの順に:

  1. オペランドがreflect.Valueの場合、オペランドは、それが保持している具体的な値に置き換えられ、印刷は次のルールから続行されます。

  2. オペランドがFormatterインターフェースを実装している場合、それが呼び出されます。 Formatterは、フォーマットを細かく制御します。

  3. %v動詞が#フラグ(%#v)と共に使用され、オペランドがGoStringerインターフェイスを実装している場合、それが呼び出されます。

形式(Printlnなどでは暗黙的に%vです)が文字列(%s%q%v%x%X)に対して有効な場合、次の2つの規則が適用されます。

  1. オペランドがエラーインターフェイスを実装している場合、Errorメソッドが呼び出されてオブジェクトが文字列に変換され、動詞(存在する場合)が必要に応じてフォーマットされます。

  2. オペランドがメソッドString()文字列を実装する場合、そのメソッドが呼び出されてオブジェクトが文字列に変換され、動詞(存在する場合)の必要に応じてフォーマットされます。

18
icza