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

Linda Hamilton
Lepaskan: 2024-11-23 01:34:27
asal
756 orang telah melayarinya

Why Does Printing a `bytes.Buffer` in Go Produce Different Output Depending on Whether a Pointer or Value is Used?

Gelagat Berbeza dalam Mencetak bait.Buffer dalam Go

In Go, semasa mencetak bait.Buffer menggunakan fmt.Println(), tingkah laku mungkin berbeza-beza bergantung pada sama ada anda menggunakan penunjuk kepada bait.Penimbal atau nilai secara langsung. Berikut ialah penjelasan:

Dalam contoh pertama:

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

buf ialah penunjuk kepada bait.Penimbal, yang bermaksud ia mempunyai kaedah String() yang tersedia. Apabila anda menghantar penuding ke fmt.Println(), kaedah String() dipanggil secara automatik, yang menukar kandungan bait.Buffer kepada rentetan. Itulah sebabnya anda melihat "Hello World" dicetak.

Dalam contoh kedua:

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

buf ialah nilai jenis bait.Penimbal, bukan penunjuk. Akibatnya, kaedah String() tidak tersedia untuk nilai ini. Sebaliknya, fmt.Println() mencetaknya sebagai nilai struct biasa, menggunakan format lalai {field0 field1 ...}. Medan di sini ialah bait yang disimpan dalam penimbal, diwakili sebagai sekeping integer.

Untuk sentiasa mencetak kandungan bait.Penimbal sebagai rentetan, tidak kira sama ada anda menggunakan penunjuk atau nilai, anda boleh panggil kaedah String() secara eksplisit sebelum mencetak:

fmt.Println(buf.String())
Salin selepas log masuk

Ini akan memastikan tingkah laku yang konsisten merentas kedua-dua kes.

Atas ialah kandungan terperinci Mengapa Mencetak `bytes.Buffer` dalam Go Menghasilkan Output Berbeza Bergantung pada Sama ada Penunjuk atau Nilai Digunakan?. 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