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