ホームページ > バックエンド開発 > Golang > `fmt.Println` が常にカスタム タイプの `String()` メソッドを呼び出さないのはなぜですか?

`fmt.Println` が常にカスタム タイプの `String()` メソッドを呼び出さないのはなぜですか?

Patricia Arquette
リリース: 2024-12-31 11:43:10
オリジナル
430 人が閲覧しました

Why Doesn't `fmt.Println` Always Call My Custom Type's `String()` Method?

fmt.Println でのインターフェイス変換によるメソッド呼び出しの失敗

fmt.Println を使用してカスタム タイプの値を出力しようとすると、型の String() メソッドの予期されたメソッド呼び出しが行われない可能性があります。この問題は、値がポインタではなく値として渡される場合に発生します。

コード例を考えてみましょう。

import "fmt"

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) // Value-based object
}
ログイン後にコピー

この例では、Car の予期された String() メソッドは実行されません。 fmt.Println が Car 型の値で使用されるときに呼び出されます。代わりに、値はデフォルトの Go 書式設定メカニズムを使用して書式設定されます。

この問題を解決し、オブジェクトが値であるかポインターであるかに関係なくカスタム String() メソッドが確実に呼び出されるようにするには、次のオプションを使用します。

  • 値ベースの型に String() を実装: このアプローチでは、手動変換が必要な場合、String() メソッドが呼び出されるたびにオブジェクトがコピーされるため、パフォーマンスが低下します。
  • 常に fmt.Println にポインターを渡す: fmt.Println の場合、Println 関数は自動的にそれを逆参照し、基になる値に対して String() メソッドを呼び出します。これにより、オブジェクトが値であるかポインターであるかに関係なく、目的の書式設定が確実に適用されます。
fmt.Println(&myCar) // Pointer-based object
ログイン後にコピー

これらのガイドラインに従うことで、String() メソッドを確実に呼び出して、 fmt.Println.

内のカスタム タイプの書式設定

以上が`fmt.Println` が常にカスタム タイプの `String()` メソッドを呼び出さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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