Memahami Tingkah Laku fmt.Println dengan Ahli Struktur
Dalam Go, apabila kami memanggil fmt.Println pada struct, kami menjangkakan ia akan keluar perwakilan rentetan ahli struct menggunakan kaedah String() masing-masing. Walau bagaimanapun, ini tidak selalu berlaku.
Pertimbangkan kod berikut:
package main import ( "fmt" ) type bar struct { } func (b bar) String() string { return "bar" } type foo struct { b []*bar bb *bar } func main() { f := foo{b: []*bar{&bar{}}, bb: &bar{}} fmt.Println(f, f.b, f.bb) }
Dalam kod ini, kami mentakrifkan jenis bar dengan kaedah String() yang mengembalikan rentetan "bar ." Kami juga mentakrifkan jenis foo dengan medan b dan bb, yang merupakan kepingan dan penunjuk kepada jenis bar, masing-masing.
Apabila kita memanggil fmt.Println pada f, f.b dan f.bb, kita mendapat output berikut :
{[0x176f44] 0x176f44} [bar] bar
Ini berbeza daripada apa yang kami jangkakan, iaitu ialah:
{[bar] bar} [bar] bar
Sebab Di Sebalik fmt.Gelagat Println
Terdapat beberapa sebab mengapa fmt.Println tidak menggunakan kaedah String() ahli apabila dipanggil pada struct:
Penyelesaian
Untuk membetulkannya, kita perlu memastikan bahawa kaedah String() dan medan dalam struct dieksport. Berikut ialah kod yang diperbetulkan:
package main import ( "fmt" ) type Bar struct { } func (b Bar) String() string { return "bar" } type Foo struct { B []Bar BB Bar } func main() { f := Foo{B: []Bar{Bar{}}, BB: Bar{}} fmt.Println(f) }
Sekarang, apabila kita menjalankan kod, kita mendapat output yang dijangkakan:
{[bar] bar} [bar] bar
Atas ialah kandungan terperinci Mengapa fmt.Println Tidak Menggunakan Kaedah String() Ahli Struct dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!