ホームページ >バックエンド開発 >Golang >fmt.Println が値ではなくポインターに対して Car.String() を呼び出すのはなぜですか?

fmt.Println が値ではなくポインターに対して Car.String() を呼び出すのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 06:42:14404ブラウズ

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

fmt.Println でオブジェクトを印刷するために String() を呼び出す

fmt.Println インターフェイスと Stringer インターフェイスを扱う場合、型変換プロセスを理解する

提供されたコードでは、Car.String()ポインタを処理するときに呼び出されますが、値を使用するときには呼び出されません。これは、fmt.Println がポインタと値の両方をインターフェイス タイプに強制するためです。

fmt はその後、タイプの切り替えを実行して、値を出力する方法を決定します。{} fmt.Stringer (文字列を返す String メソッドを使用) を実装する値の場合、そのメソッドの結果が出力されます。ただし、ポインター型で String メソッドが定義されている値の場合、型の切り替えは失敗します。

解決策:

これを解決するには、Car 型に String を実装します。または、以下に示すように、ポインタを fmt.Println に渡します。

type Car struct {
    year int
    make string
}

func (c Car) String() string {
    return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    fmt.Println(&myCar) // Passing the pointer explicitly
}

あるいは、次のようにすることもできます。 String を手動で呼び出すためのカスタム型アサーションですが、このアプローチは推奨されません:

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}

fmt.Println の型変換動作に対処することで、オブジェクトの値や形式に関係なく、オブジェクトのフォーマット方法を効果的に制御できます。ポインターの性質。

以上がfmt.Println が値ではなくポインターに対して Car.String() を呼び出すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。