構造体メンバーを使用した fmt.Println の動作を理解する
Go では、構造体に対して fmt.Println を呼び出すと、出力が期待されます。それぞれの String() メソッドを使用した構造体のメンバーの文字列表現。ただし、常にそうであるとは限りません。
次のコードを考えてみましょう:
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" を返す String() メソッドを使用してバー タイプを定義します。 。」また、フィールド b と bb を持つ foo 型も定義します。これらは、それぞれスライスと bar 型へのポインタです。
f、f.b、および f.bb で fmt.Println を呼び出すと、次の出力が得られます。 :
{[0x176f44] 0x176f44} [bar] bar
これは私たちが期待するものとは異なります。
{[bar] bar} [bar] bar
fmt.Println の動作の背後にある理由
fmt.Println が呼び出されたときにメンバーの String() メソッドを使用しない理由はいくつかあります。にstruct:
解決策
これを修正するには、次のことを確認する必要があります。 String() メソッドと構造体のフィールドがエクスポートされます。修正されたコードは次のとおりです:
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) }
コードを実行すると、期待どおりの出力が得られます:
{[bar] bar} [bar] bar
以上がfmt.Println が Go で Struct のメンバー String() メソッドを使用しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。