次のコードがあるとします。
package main
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)
}
fmt.Println(myCar) を呼び出し、問題のオブジェクトがポインターの場合、String() メソッドが適切に呼び出されます。ただし、オブジェクトが値の場合、出力は Go に組み込まれているデフォルトの書式設定を使用して書式設定され、そのオブジェクトを書式設定するコードは呼び出されません。
興味深いのは、どちらの場合でも myCar.String() を手動で呼び出すと、オブジェクトがポインターまたは値のいずれであっても適切に機能することです。
Println で使用する場合、オブジェクトが値ベースかポインターベースかに関係なく、オブジェクトを希望どおりにフォーマットするにはどうすればよいですか?
String に value メソッドを使用したくありません。これは、呼び出されるたびにオブジェクトがコピーされ、その継ぎ目が不合理であることを意味するためです。また、ダックタイピングシステムに機能させようとしているため、常に手動で .String() を呼び出す必要はありません。