fmt.Println および String() メソッド
fmt.Println が呼び出されたときにメンバーの String() メソッドを利用しないのはなぜですか構造体?基礎となるメカニズムを調べてみましょう。
次のコードを考えてみましょう:
import "fmt" type Bar struct{} func (b Bar) String() string { return "bar" } type Foo struct { B []*Bar BB *Bar } func main() { f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}} fmt.Println(f, f.B, f.BB) }
このコードは期待どおりの出力を生成します:
{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
しかし、なぜ出力が出力されるのか不思議に思うかもしれません。これは次のとおりではありません:
{[bar] bar} [bar] bar
これは、メモリの代わりにメンバーの String() 表現を表示します。
その理由は、Bar 型とその String() メソッドの両方がエクスポートされないという性質にあります。 Go では、エクスポートされていないメンバーとメソッドは、それらが定義されているパッケージ内でのみアクセスできます。 fmt.Println は同じパッケージの一部ではないため、これらのエクスポートされていない要素にはアクセスできません。したがって、非組み込み型のメモリ アドレスを出力するデフォルトの動作に頼ります。
この問題に対処するには、Bar 型とその String() メソッドの両方をエクスポートする必要があります。さらに、適切な JSON エンコードとデコードのために、Foo 構造体のフィールドもエクスポートする必要があります。
正しいアプローチを示すコードの修正バージョンを次に示します。
import "fmt" type Bar struct{} func (b Bar) String() string { return "bar" } type Foo struct { B []*Bar BB *Bar } func main() { f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}} fmt.Println(f) }
これらの変更により
{[bar] bar} [bar] bar
この例では、フォーマッタと適切に統合するためにエクスポートされた型とメソッドを使用することの重要性を強調しています。 fmt.Println のような
以上が構造体とメソッドがエクスポートされない限り、「fmt.Println」は構造体の「String()」メソッドを使用しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。