Rumah >pembangunan bahagian belakang >Golang >Mengapakah `fmt.Println` Go Menghasilkan Output Tidak Dijangka dengan Jenis Terbenam dan Kaedah `String()` Berbilang?
Gelagat Kaedah Rentetan() Tidak Dijangka dalam Jenis Terbenam Go
Apabila menggunakan jenis terbenam dalam Go, medan dan kaedah jenis terbenam ialah berkesan diwarisi oleh jenis memeluk. Ini boleh membawa kepada tingkah laku yang tidak dijangka, terutamanya apabila berurusan dengan kaedah String() tersuai.
Pertimbangkan contoh ini:
type Engineer struct { Person TaxPayer Specialization string } type Person struct { Name string Age int } func (p Person) String() string { return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age) } type TaxPayer struct { TaxBracket int } func (t TaxPayer) String() string { return fmt.Sprintf("%d", t.TaxBracket) }
Dalam kod ini, jenis Jurutera membenamkan kedua-dua jenis Orang dan Pembayar Cukai , yang mentakrifkan kaedah String() mereka sendiri untuk memformat data masing-masing. Walau bagaimanapun, jika kita membuat instantiat objek Jurutera dan memanggil fmt.Println(jurutera), output tidak seperti yang dijangkakan:
{name: John Doe, age: 35 3 Construction}
Output ini menunjukkan bahawa kaedah Engineer.String() sedang digunakan, tetapi Kaedah TaxPayer.String() juga menyumbang kepada hasilnya. Ini kerana kaedah String() dinaikkan pangkat kepada jenis Jurutera apabila dibenamkan, dan kedua-dua kaedah Person.String() dan TaxPayer.String() layak untuk permohonan.
Untuk menjelaskan perkara ini, pertimbangkan perkara berikut senario:
fmt.Println(engineer.String()) // Compile error: ambiguous selector engineer.String
Dalam kes ini, pengkompil menimbulkan ralat kerana jurutera mempunyai berbilang String() yang dinaikkan pangkat kaedah, menghasilkan pemilih yang tidak jelas. Walau bagaimanapun, fmt.Println(jurutera) berjaya kerana pengkompil secara automatik memilih pemformatan lalai untuk Jurutera berdasarkan medannya.
Sebab bagi percanggahan yang jelas ini ialah fungsi fmt.Println() pada dasarnya mewakilkan penukaran rentetan kepada pakej fmt. Apabila ia menemui nilai yang melaksanakan antara muka fmt.Stringer (yang mentakrifkan kaedah String()), ia menggunakan kaedah itu untuk mendapatkan perwakilan rentetan.
Dalam contoh kami, kerana kedua-dua Person.String() dan TaxPayer.String() wujud, kedua-duanya tidak dinaikkan pangkat kepada Jurutera dan pemformatan lalai digunakan. Walau bagaimanapun, dalam kes fmt.Println(engineer.String()), pengkompil menemui pemilih samar-samar dan menimbulkan ralat.
Kesimpulannya, jenis terbenam boleh membawa kepada tingkah laku kaedah String() yang tidak dijangka apabila berbilang jenis terbenam menentukan kaedah tersebut. Adalah penting untuk memahami mekanik pembenaman dan promosi kaedah untuk mengelakkan kekeliruan yang mungkin berlaku dan memastikan output yang diingini.
Atas ialah kandungan terperinci Mengapakah `fmt.Println` Go Menghasilkan Output Tidak Dijangka dengan Jenis Terbenam dan Kaedah `String()` Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!