ジレンマを想像してください。カスタムを提供するために構造体に String() メソッドを定義します。しかし、fmt.Println はそれを無視しているようで、読めない出力が残ります。これは次のコードの場合です:
package main 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) }
期待される出力:
{bar bar} [bar] bar
実際の出力:
{[0x176f44] 0x176f44} [bar] bar
この背景には 2 つの重要な要素があります動作:
これを修正するには、bar タイプと foo フィールドの両方をエクスポートする必要があります。修正されたコードは次のとおりです:
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) }
Playground: https://play.golang.org/p/OhoIcB7cA3
これにより、Bar とその String() メソッドの両方が確実にエクスポートされ、 fmt.Println を使用してください。その結果、目的の出力が得られます。
{bar bar} [bar] bar
結論として、fmt.Println がこの強力なカスタム書式設定機能を活用できるように、String() メソッドに含まれる型とフィールドの両方をエクスポートすることを忘れないでください。
以上が`fmt.Println` が Struct の `String()` メソッドを使用しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。