Menyingkap Kerja Dalaman: Mengapa fmt.Println Bypasses String() Kaedah untuk Structs
Pemerhatian yang menarik telah muncul mengenai fungsi fmt.Println apabila dipanggil pada objek struct. Walaupun seseorang mungkin menjangkakan kaedah String() digunakan untuk setiap ahli, ini tidak berlaku. Meneliti percanggahan ini akan menjelaskan sebab asas di sebalik tingkah laku ini.
Punca Punca
Untuk memahami sebab fmt.Println melangkau kaedah String() untuk ahli struct, adalah penting untuk mempertimbangkan dua faktor penting:
A Path to Resolution
Untuk membetulkan isu ini dan membolehkan fmt.Println menggunakan kaedah String() untuk ahli struct, beberapa pengubahsuaian adalah perlu:
Dengan melaksanakan perubahan ini, fmt.Println akan mendapatkan akses kepada kedua-dua kaedah String() dan medan yang dieksport, membolehkannya menghasilkan yang dikehendaki output:
package main import ( "fmt" ) type Bar struct { } func (b Bar) String() string { return "bar" } type Foo struct { B []Bar BB Bar } func main() { f := Foo{B: []Bar{Bar{}}, BB: Bar{}} fmt.Println(f) }
Output:
{[bar] bar} [bar] bar
Kesimpulan
Pemahaman status eksport dan had kebolehcapaian medan dalam Go menjelaskan mengapa fmt.Println tidak menggunakan kaedah String() untuk struct ahli. Dengan menangani isu ini melalui konvensyen eksport yang betul, gelagat yang diingini boleh dicapai, memupuk kejelasan dan ketekalan dalam kod.
Atas ialah kandungan terperinci Mengapakah `fmt.Println` Memanggil Kaedah `String()` pada Ahli Struct dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!