Apabila bekerja dengan antara muka Stringer Go, pengguna mungkin menghadapi situasi di mana String( ) kaedah tidak dipanggil apabila menghantar objek bukan penunjuk ke fmt.Println. Untuk memberi penerangan tentang tingkah laku ini, mari kita periksa kod berikut:
package main import "fmt" type Car struct { year int make string } func (c *Car) String() string { return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year) } func main() { myCar := Car{year: 1996, make: "Toyota"} fmt.Println(myCar) }
Di sini, kami mentakrifkan struct Kereta dan melaksanakan kaedah String() sebagai kaedah nilai. Walau bagaimanapun, apabila kita menyerahkan myCar sebagai hujah kepada fmt.Println, objek ditukar kepada antara muka{}. Ini menyebabkan pakej fmt menggunakan pemformatan lalainya sendiri, memintas kaedah String() kami.
Kunci untuk memahami tingkah laku ini terletak pada fakta bahawa kami telah melaksanakan kaedah String() pada penerima penuding (* Kereta). Apabila menghantar nilai jenis Kereta, pengkompil tidak menukarnya secara automatik kepada penunjuk. Oleh itu, pakej fmt tidak boleh memadankan kaedah String() kami dengan nilai yang kami hantar.
Sebaliknya, untuk menggunakan kaedah String() kami apabila menghantar objek bukan penuding, kami perlu menukar nilai secara manual kepada penunjuk menggunakan & operator:
fmt.Println(&myCar)
Dengan berbuat demikian, kami menghantar penunjuk ke objek Kereta ke fmt.Println. Ini membolehkan kaedah String() penerima nilai digunakan dan pemformatan tersuai kami digunakan.
Ringkasnya, apabila bekerja dengan antara muka Stringer, adalah penting untuk diingat bahawa kaedah mesti ditakrifkan pada penerima yang betul taip. Untuk penunjuk, penerima penunjuk adalah sesuai, manakala untuk jenis nilai, penerima nilai boleh digunakan. Jika menghantar penunjuk secara manual tidak diingini, seseorang boleh mempertimbangkan untuk melaksanakan kaedah String() sebagai kaedah penunjuk pada struktur Kereta sebenar.
Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Memanggil Kaedah Antara Muka Stringer Saya Apabila Menggunakan Objek Bukan Penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!