reflect.Value.String() の説明の翻訳・補足
GoのreflectパッケージのValue型のString()メソッドの説明の英文が、ちょっとわかりにくいので、情報を補いつつ翻訳しました。
原文は以下の通りです。
String returns the string v's underlying value, as a string. String is a special case because of Go's String method convention. Unlike the other getters, it does not panic if v's Kind is not String. Instead, it returns a string of the form
"<T value>"where T is v's type. The fmt package treats Values specially. It does not call their String method implicitly but instead prints the concrete values they hold.
その翻訳は次のようになります。
Stringメソッドは
vの基底になっている≒reflect.Valueが格納している文字列を文字列型として返します。
このStringメソッドはGoのStringメソッドの慣習に従わない特別なケースです。
慣習に従うならばreflect.Value自身の文字列表現を返します。
(
reflect.Valueの)その他のゲッターとは異なり、このメソッドはvのKindが文字列 (reflect.String) でなくてもパニックはしません。
その代わりこのメソッドは"<T value>"という形式の文字列を返します。
このときTはvの型名です。
ベースの値が非文字列型の場合にどう表現されるか、という話しです。
fmtパッケージはreflect.Valueを特別扱いします。
fmtパッケージはこのStringメソッドを暗黙的に呼びだすことはせずに、代わりにreflect.Valueが保持する具体的な値を(文字列で)表示します。
fmtにおける %s や %v は通常 String() メソッドを呼び出しますが、reflect.Valueは例外だという話しです。
原文にはString(もしくはstring)が複数の意味で登場するので、それぞれをきちんと区別しないと正しい意味は理解できません。ちなみに複数とは、「メソッド名」としてのString、文字通りの「文字列」、Goの型としてのstring、メソッド定義の慣習としてのString、reflect.Kind列挙の一つ値としてのreflect.String、といった感じです。
ややこしいですね!
Discussion