Memahami Gelagat Antara Muka Go untuk Pengendalian Ralat
Dalam bahasa pengaturcaraan Go, antara muka menyediakan mekanisme yang berkuasa untuk menentukan kontrak antara jenis. Satu kontrak sedemikian ialah antara muka "Ralat", yang membenarkan jenis untuk mewakili ralat. Artikel ini meneroka senario khusus di mana mentakrifkan kaedah "Ralat" untuk jenis tersuai membawa kepada output yang tidak dijangka.
Masalahnya:
Pertimbangkan coretan kod 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, not 5 }
Apabila anda menjalankan kod ini, output adalah "ralat buruk" dan bukannya yang dijangkakan nilai integer 5. Mengapa ini berlaku?
Jawapannya:
Tingkah laku ini boleh dijelaskan dengan memahami cara fmt.Println mengendalikan nilai. Menurut dokumentasi pakej fmt, jika operan melaksanakan antara muka "Ralat", kaedah Ralatnya digunakan untuk menukar objek kepada rentetan untuk dicetak. Memandangkan jenis T tersuai melaksanakan antara muka ini, kaedah Ralatnya mengembalikan "ralat buruk", yang dicetak bukannya nilai integer.
Resolusi:
Untuk mencetak nilai integer T, anda boleh menggunakan fungsi fmt.Printf dengan penentu format yang sesuai. Contohnya:
fmt.Printf("%d", v) //output: 5
Secara bergantian, anda boleh menentukan kaedah String() tersuai untuk jenis T untuk mengawal format output apabila menggunakan fmt.Println:
type T int func (t T) String() string { return strconv.Itoa(int(t)) } func main() { var v interface{} = T(5) fmt.Println(v) //output: 5 }
Atas ialah kandungan terperinci Mengapa fmt.Println Mencetak 'ralat buruk' Daripada 5 Apabila Jenis Tersuai Melaksanakan Antara Muka Ralat Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!