ホームページ > バックエンド開発 > Golang > 埋め込み型に競合する `String()` メソッドがある場合、Go の埋め込み型に対して `fmt.Println()` の動作が異なるのはなぜですか?

埋め込み型に競合する `String()` メソッドがある場合、Go の埋め込み型に対して `fmt.Println()` の動作が異なるのはなぜですか?

Patricia Arquette
リリース: 2024-11-30 07:28:11
オリジナル
363 人が閲覧しました

Why does `fmt.Println()` behave differently with embedded types in Go when the embedded types have conflicting `String()` methods?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート