Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `fmt.Println` Menunjukkan Output Berbeza untuk `*bytes.Buffer` dan `bytes.Buffer` dalam Go?
Kes Ingin tahu Output Cetakan Berbeza: *bait.Penimbal lwn. bait.Penimbal
Apabila bekerja dengan bait dalam Go, memahami perbezaan halus antara nilai penuding dan bukan penuding boleh membawa kepada hasil cetakan yang tidak dijangka.
Apabila anda laksanakan kod berikut:
buf := new(bytes.Buffer) buf.WriteString("Hello World") fmt.Println(buf)
Anda mendapat output biasa: "Hello World". Ini kerana, untuk nilai penunjuk seperti *bytes.Buffer, Go menyemak sama ada nilai itu mempunyai kaedah String(). Dalam kes ini, *bytes.Buffer melaksanakan String(), dan penggunaannya menyebabkan kandungan penimbal dicetak sebagai rentetan.
Walau bagaimanapun, kod yang sama dilaksanakan untuk nilai bukan penuding seperti bait.Buffer berkelakuan berbeza :
var buf bytes.Buffer buf.WriteString("Hello World") fmt.Println(buf)
Daripada perwakilan rentetan yang dijangkakan, anda mendapat yang berikut output:
{[72 101 108 108 111 32 119 111 114 108 100] 0 [72 101 108 108 111 32 119 111 114 108 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]} 0
Output yang kelihatan samar ini mewakili susun atur memori bait. Struktur penimbal, termasuk medan dan bait paddingnya.
Punca perbezaan ini terletak pada cara Go mengendalikan percetakan nilai. Ia menyemak sama ada nilai yang dicetak mempunyai kaedah String() dan jika ya, gunakannya untuk mendapatkan perwakilan rentetan. Untuk jenis penuding *bytes.Buffer, kaedah String() hadir, dan dengan itu kandungannya dicetak sebagai rentetan. Untuk bait jenis bukan penuding. Penampan, walau bagaimanapun, kaedah String() tidak dilaksanakan, membawa kepada pemformatan lalai bagi medan individunya.
Adalah penting untuk mengingati perbezaan ini untuk mengelakkan kejutan apabila berfungsi dengan bait dan penimbal dalam Go. Memahami gelagat berbeza nilai penuding dan bukan penuding akan membantu anda menulis kod yang lebih boleh diramal dan teguh.
Atas ialah kandungan terperinci Mengapakah `fmt.Println` Menunjukkan Output Berbeza untuk `*bytes.Buffer` dan `bytes.Buffer` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!