Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Kaedah `String()` Go Berkelakuan dengan Jenis Terbenam dan Pelbagai Kaedah Digalakkan?
Interaksi Kaedah String() yang Tidak Diduga dalam Jenis Go Terbenam
Memahami nuansa kelakuan kaedah String() dalam Go adalah penting apabila berfungsi dengan jenis terbenam. Pertimbangkan coretan kod berikut:
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) } func main() { engineer := Engineer{ Person: Person{ Name: "John Doe", Age: 35, }, TaxPayer: TaxPayer{3}, Specialization: "Construction", } fmt.Println(engineer) }
Keluaran kod ini ialah "nama: John Doe, umur: 35 3 Pembinaan." Tingkah laku ini, pada mulanya membingungkan, boleh dijelaskan dengan mengkaji cara jenis terbenam berinteraksi dengan kaedah String().
Promosi Jenis Terbenam
Dalam Go, jenis terbenam membenarkan kemasukan medan dan kaedah daripada jenis lain. Apabila jenis membenamkan jenis lain, medan dan kaedah jenis terbenam dipromosikan kepada jenis pembenaman, berkelakuan seolah-olah ia ditakrifkan pada jenis pembenaman. Dalam contoh kami, jenis Jurutera membenamkan kedua-dua jenis Orang dan Pembayar Cukai.
Pemilihan Kaedah
Apabila kaedah String() dipanggil pada jenis terbenam, tingkah laku lalai ialah memilih kaedah paling cetek (paling tidak bersarang) dengan nama itu. Walau bagaimanapun, jika terdapat berbilang kaedah String() yang dipromosikan pada kedalaman yang sama, ungkapan pemilih menjadi menyalahi undang-undang, mengakibatkan ralat masa kompilasi.
Dalam kod yang disediakan, kedua-dua jenis Orang dan Pembayar Cukai mempunyai String() kaedah. Oleh itu, Engineer.String() ialah pemilih yang tidak sah. Akibatnya, tiada kaedah String() dipanggil terus semasa mencetak nilai Jurutera.
Penjanaan Rentetan Pakej fmt
Apabila tiada String() yang jelas kaedah yang ditakrifkan untuk jenis struct, pakej fmt kembali pada perwakilan rentetan lalai, yang termasuk mencetak nilai medan. Dalam struct Jurutera, ini menghasilkan output "nama: John Doe, umur: 35 3 Pembinaan."
Kesan Kaedah Mengalih Keluar
Menariknya, mengalih keluar mana-mana Orang .String() atau TaxPayer.String() menyelesaikan kekaburan, membenarkan kaedah String() yang tinggal digunakan untuk rentetan generasi. Ini menekankan kepentingan mempertimbangkan dengan teliti konvensyen penamaan kaedah apabila menggunakan jenis terbenam.
Kesimpulan
Kelakuan kaedah String() pada jenis terbenam menyerlahkan keperluan untuk kejelasan dan pandangan jauh semasa mentakrifkan kaedah. Dengan memahami mekanik pemilihan kaedah dan promosi, pembangun boleh mengelakkan pemilih yang samar-samar dan memastikan perwakilan rentetan yang konsisten bagi jenis mereka.
Atas ialah kandungan terperinci Bagaimanakah Kaedah `String()` Go Berkelakuan dengan Jenis Terbenam dan Pelbagai Kaedah Digalakkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!