📚

reflect.Value.String() の説明の翻訳・補足

2022/04/02に公開

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の)その他のゲッターとは異なり、このメソッドはvKindが文字列 (reflect.String) でなくてもパニックはしません。
その代わりこのメソッドは "<T value>" という形式の文字列を返します。
このとき Tv の型名です。

ベースの値が非文字列型の場合にどう表現されるか、という話しです。

fmtパッケージはreflect.Valueを特別扱いします。
fmtパッケージはこのStringメソッドを暗黙的に呼びだすことはせずに、代わりにreflect.Valueが保持する具体的な値を(文字列で)表示します。

fmtにおける %s%v は通常 String() メソッドを呼び出しますが、reflect.Valueは例外だという話しです。


原文にはString(もしくはstring)が複数の意味で登場するので、それぞれをきちんと区別しないと正しい意味は理解できません。ちなみに複数とは、「メソッド名」としてのString、文字通りの「文字列」、Goの型としてのstring、メソッド定義の慣習としてのString、reflect.Kind列挙の一つ値としてのreflect.String、といった感じです。

ややこしいですね!

Discussion