Rumah > pembangunan bahagian belakang > Golang > Mengapakah `fmt.Println` Mencetak 'ralat buruk' Daripada 5 Apabila Menggunakan Antara Muka Go dengan Kaedah `Ralat` Tersuai?

Mengapakah `fmt.Println` Mencetak 'ralat buruk' Daripada 5 Apabila Menggunakan Antara Muka Go dengan Kaedah `Ralat` Tersuai?

Barbara Streisand
Lepaskan: 2024-12-10 05:04:09
asal
779 orang telah melayarinya

Why Does `fmt.Println` Print

Memahami Gelagat Pelik Jenis Antara Muka dalam Go

Dalam Go, antara muka mentakrifkan kontrak yang membenarkan jenis yang berbeza berkelakuan serupa. Walau bagaimanapun, mungkin terdapat tingkah laku yang tidak dijangka apabila menggunakan antara muka dengan kaedah tersuai, seperti yang digambarkan dalam contoh berikut:

type T int

func (t T) Error() string {
    return "bad error"
}

func main() {
    var v interface{} = T(5)
    fmt.Println(v) // Output: "bad error"
}
Salin selepas log masuk

Mengapa kod di atas tidak mencetak nilai T(5) seperti yang dijangkakan? Sebabnya terletak pada cara Go berinteraksi dengan antara muka dan kaedahnya.

fmt.Println dan Pemformat %v

Fungsi fmt.Println menggunakan pemformat %v untuk mencetak nilai antara muka. Menurut dokumentasi, jika operan melaksanakan antara muka ralat, kaedah Ralatnya akan digunakan untuk menukar objek kepada rentetan.

Dalam kes kami, T melaksanakan antara muka ralat dengan kaedah Ralat tersuai yang mengembalikan " kesilapan yang teruk". Apabila fmt.Println dipanggil dengan v (nilai antara muka jenis T), ia menggunakan kaedah Ralat untuk menjana perwakilan rentetannya. Inilah sebabnya kami melihat "ralat buruk" sebagai output dan bukannya nilai 5.

Pemformatan Tersuai

Untuk mengelakkan tingkah laku yang tidak dijangka ini, anda boleh menggunakan pemformatan tersuai dengan menghantar rentetan format ke fmt.Printf. Contohnya:

fmt.Printf("%d", v) // Output: "5"
Salin selepas log masuk

Ini secara eksplisit mengarahkan fmt.Printf untuk mencetak nilai v sebagai integer perpuluhan, mengatasi pemformatan %v lalai.

Kesimpulan

Memahami cara Go berinteraksi dengan antara muka dan pemformat %v adalah penting untuk mengelakkan tingkah laku yang tidak dijangka apabila berurusan dengan kaedah dan pemformatan tersuai. Harap maklum bahawa kaedah Ralat antara muka ralat boleh mempengaruhi hasil fmt.Println dan menggunakan pemformatan tersuai apabila perlu untuk memastikan output yang diingini.

Atas ialah kandungan terperinci Mengapakah `fmt.Println` Mencetak 'ralat buruk' Daripada 5 Apabila Menggunakan Antara Muka Go dengan Kaedah `Ralat` Tersuai?. 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