印刷することを知っていますint
使用できます%d
、およびstring
を使用できます%s
ですが、%v
で印刷します。だから私がいつも%v
それらを印刷しますか?これを行うとどのような問題が発生しますか?
悪いことは起こりませんが、_%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を使用して印刷する場合を除いて、特定のインターフェースを実装するオペランドには、特別なフォーマットの考慮事項が適用されます。アプリケーションの順に:
オペランドがreflect.Valueの場合、オペランドは、それが保持している具体的な値に置き換えられ、印刷は次のルールから続行されます。
オペランドがFormatterインターフェースを実装している場合、それが呼び出されます。 Formatterは、フォーマットを細かく制御します。
%v動詞が#フラグ(%#v)と共に使用され、オペランドがGoStringerインターフェイスを実装している場合、それが呼び出されます。
形式(Printlnなどでは暗黙的に%vです)が文字列(%s%q%v%x%X)に対して有効な場合、次の2つの規則が適用されます。
オペランドがエラーインターフェイスを実装している場合、Errorメソッドが呼び出されてオブジェクトが文字列に変換され、動詞(存在する場合)が必要に応じてフォーマットされます。
オペランドがメソッドString()文字列を実装する場合、そのメソッドが呼び出されてオブジェクトが文字列に変換され、動詞(存在する場合)の必要に応じてフォーマットされます。