Rumah > pembangunan bahagian belakang > Golang > Mengapa Mencetak `bytes.Buffer` dalam Go Menghasilkan Output Berbeza Bergantung pada Sama ada Ia Penunjuk atau Bukan?

Mengapa Mencetak `bytes.Buffer` dalam Go Menghasilkan Output Berbeza Bergantung pada Sama ada Ia Penunjuk atau Bukan?

Linda Hamilton
Lepaskan: 2024-11-26 05:04:09
asal
328 orang telah melayarinya

Why Does Printing a `bytes.Buffer` in Go Produce Different Output Depending on Whether It's a Pointer or Not?

Gelagat Berbeza dalam Mencetak bait.Penimbal dalam Go

Dalam Go, gelagat mencetak nilai jenis bait.Penimbal berbeza bergantung pada sama ada nilai penuding atau bukan penuding.

Pertimbangkan kod berikut contoh:

buf := new(bytes.Buffer)
buf.WriteString("Hello world")
fmt.Println(buf)
Salin selepas log masuk

Dalam kes ini, menggunakan operator * untuk membatalkan rujukan penuding penimbal menggunakan kaedah String() bagi bait.Jenis Penampan. Kaedah ini mengembalikan perwakilan rentetan kandungan penimbal, menyebabkan "Hello World" dicetak.

Sekarang, mari kita ubah suai kod seperti berikut:

var buf bytes.Buffer
buf.WriteString("Hello world")
fmt.Println(buf)
Salin selepas log masuk

Tanpa menggunakan operator *, kami menghantar nilai bukan penunjuk jenis bait. Penampan. Tidak seperti contoh sebelumnya, pakej fmt tidak memanggil kaedah String() dalam kes ini. Sebaliknya, ia mencetak penimbal sebagai nilai struktur, menggunakan pemformatan lalai:

{[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}
Salin selepas log masuk

Output ini mewakili struktur dalaman bait. Penampan, termasuk kepingan yang menyokong penimbal dan medan panjang dan kapasiti.

Perbezaan utama antara kedua-dua contoh ini terletak pada kaedah String(). Apabila mencetak nilai jenis *bytes.Buffer, pakej fmt menggunakan kaedah String() untuk mendapatkan perwakilan rentetan kandungan penimbal. Oleh kerana nilai bukan penuding jenis bait.Buffer tidak mempunyai kaedah ini, pemformatan struct lalai digunakan.

Atas ialah kandungan terperinci Mengapa Mencetak `bytes.Buffer` dalam Go Menghasilkan Output Berbeza Bergantung pada Sama ada Ia Penunjuk atau Bukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan