Rumah >pembangunan bahagian belakang >Golang >Mengapa fmt.Println Tidak Menggunakan Kaedah String() Ahli Struct dalam Go?
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!