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