Go の埋め込み型を使用した String() メソッドのあいまいな動作
Go で埋め込み型を扱う場合、String の動作を理解する() メソッドはわかりにくいかもしれません。特定のコード サンプルに基づいてこの動作を詳しく見てみましょう。
次のコードについて考えてみましょう。
type Engineer struct { Person TaxPayer Specialization string } type Person struct { Name string Age int } func (p Person) String() string { return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age) } type TaxPayer struct { TaxBracket int } func (t TaxPayer) String() string { return fmt.Sprintf("%d", t.TaxBracket) } func main() { engineer := Engineer{ Person: Person{ Name: "John Doe", Age: 35, }, TaxPayer: TaxPayer{3}, Specialization: "Construction", } fmt.Println(engineer) }
このコードの出力は次のとおりです。
{name: John Doe, age: 35 3 Construction}
ただし、 Person.String() が削除された場合、出力は次のようになります:
3
そしてTaxPayer.String() も削除され、出力は次のように変わります。
{{John Doe 35} {3} Construction}
最初は、Engineer 構造体には暗黙的な String() メソッドが存在する必要があるようです。ただし、これは当てはまりません。
埋め込み型の String() メソッド
型が構造体内に埋め込まれている場合、そのフィールドとメソッドは、埋め込みタイプ。このメソッドの「昇格」は、複数の埋め込み型が String() などの同じ名前のメソッドを定義している場合、あいまいさを引き起こす可能性があります。
指定されたコード サンプルでは、Person と TaxPayer の両方に String() があるため、これらのメソッドをエンジニア タイプに昇格させると、あいまいさが生じます。これが、Engineer.String() がコンパイル エラーになる理由です。
fmt.Println() を使用するときに曖昧さエラーが発生しない理由
エンジニアのメソッド セットにはあいまいさがあるにもかかわらず、 , fmt.Println(engineer) ではコンパイルエラーにはなりません。これは、fmt.Println() が fmt.Fprint(os.Stdout, Engineer) を呼び出すためです。
fmt.Fprint() は、渡された値が String() メソッドを含む fmt.Stringer インターフェイスを実装しているかどうかをチェックします。 。存在する場合、String() を使用して値の文字列表現が生成されます。
この場合、Personal も TaxPayer も fmt.Stringer を実装していないため、代わりにデフォルトの書式設定 (構造体フィールド) が使用されます。これにより、fmt.Println(engineer) が呼び出されたときに表示される出力が得られます。
結論
埋め込み型の動作とそのメソッドのプロモーションを理解することが重要です。囲碁で。複数の埋め込み型が同じ名前のメソッドを定義すると、あいまいさが生じ、コンパイル エラーが発生する可能性があります。ただし、fmt.Println() を使用する場合、渡された値が fmt.Stringer.
を実装していない場合は、デフォルトの書式設定が使用されます。以上が埋め込み型に競合する `String()` メソッドがある場合、Go の埋め込み型に対して `fmt.Println()` の動作が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。