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!