Bayangkan dilema: anda mentakrifkan kaedah String() untuk struct untuk menyediakan tersuai tingkah laku percetakan, tetapi fmt.Println nampaknya mengabaikannya, meninggalkan anda dengan output tidak boleh dibaca. Ini adalah kes dengan 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) }
Output Jangkaan:
{bar bar} [bar] bar
Output Sebenar:
{[0x176f44] 0x176f44} [bar] bar
Terdapat dua faktor utama di sebalik ini tingkah laku:
Untuk membetulkannya, kita perlu menjadikan kedua-dua jenis bar dan medan foo dieksport. Berikut ialah kod yang diperbetulkan:
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) }
Taman Permainan: https://play.golang.org/p/OhoIcB7cA3
Ini memastikan kedua-dua Bar dan kaedah String()nya dieksport, membenarkan fmt.Println untuk menggunakannya. Akibatnya, kami memperoleh output yang diingini:
{bar bar} [bar] bar
Sebagai kesimpulan, ingat untuk mengeksport kedua-dua jenis dan medan yang terlibat dalam kaedah String() untuk membolehkan fmt.Println memanfaatkan ciri pemformatan tersuai yang berkuasa ini.
Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Menggunakan Kaedah `String()` Struct Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!