Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `fmt.Println` Menunjukkan Output Berbeza untuk `*bytes.Buffer` dan `bytes.Buffer` dalam Go?

Mengapakah `fmt.Println` Menunjukkan Output Berbeza untuk `*bytes.Buffer` dan `bytes.Buffer` dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-11-22 14:20:34343semak imbas

Why Does `fmt.Println` Show Different Outputs for `*bytes.Buffer` and `bytes.Buffer` in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn