Kegagalan Invokasi Kaedah dengan Penukaran Antara Muka dalam fmt.Println
Apabila cuba menggunakan fmt.Println untuk mencetak nilai jenis tersuai, penggunaan kaedah yang dijangka bagi kaedah String() jenis mungkin tidak berlaku. Isu ini timbul apabila nilai dihantar sebagai nilai dan bukannya penunjuk.
Pertimbangkan kod contoh:
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) // Value-based object }
Dalam keadaan ini, kaedah String() yang dijangkakan Kereta tidak akan dipanggil apabila fmt.Println digunakan dengan nilai jenis Kereta. Sebaliknya, nilai akan diformatkan menggunakan mekanisme pemformatan Go lalai.
Untuk menyelesaikan isu ini dan memastikan kaedah String() tersuai digunakan tidak kira sama ada objek itu nilai atau penunjuk, pilihan berikut tersedia:
fmt.Println(&myCar) // Pointer-based object
Dengan mematuhi garis panduan ini, anda boleh menggunakan kaedah String() dan mengawal pemformatan jenis tersuai dalam fmt.Println.
Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Sentiasa Memanggil Kaedah `String()` Jenis Tersuai Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!