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
Barbara Streisandasal
2024-12-10 05:04:09808semak imbas

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"
}

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"

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!

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