Invokasi Kaedah Pelik untuk Struktur Terbenam dalam Go: Memahami String()
Dalam Go, struct terbenam mewarisi kaedah jenis terbenamnya. Walau bagaimanapun, apabila berbilang jenis terbenam mentakrifkan kaedah dengan nama yang sama, kesamaran timbul. Mari kita terokai tingkah laku ini dengan memfokuskan pada kaedah String() khususnya.
Dalam kod contoh yang disediakan:
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) }
Apabila struct Jurutera dicetak menggunakan fmt.Println(jurutera), output berbeza-beza bergantung pada kehadiran kaedah String() dalam jenis terbenam.
Dengan Person.String():
Tanpa Person.String():
Tanpa Kedua-dua Rentetan() Kaedah:
Senario ini menyerlahkan peraturan kedalaman dan penyelesaian kekaburan untuk kaedah digalakkan dalam Go. Walau bagaimanapun, timbul persoalan mengapa kekaburan tidak dikesan pada masa penyusunan apabila berbilang kaedah String() dengan kedalaman sifar hadir.
Semakan Pemilih Ambigu:
Biasanya, apabila cuba menggunakan kaedah dengan pemilih yang tidak jelas, seperti jurutera.Foo(), ralat masa kompilasi berlaku. Walau bagaimanapun, ini tidak berlaku dengan kaedah bernama String().
Sebab:
Apabila mencetak nilai tanpa memanggil kaedah String() secara eksplisit, fmt.Println fungsi menyemak jika nilai melaksanakan fmt.Stringer. Ia kemudian memanggil kaedah String() yang dilaksanakan. Memandangkan semua jenis Go secara tersirat melaksanakan Stringer secara lalai (https://golang.org/doc/go1.19#fmt), sentiasa ada kaedah String() yang dipromosikan untuk sebarang jenis.
Kesimpulan :
Kekaburan dalam penggunaan kaedah untuk struktur terbenam timbul disebabkan oleh peraturan kedalaman dan pengendalian khas bagi kaedah String() untuk mencetak nilai. Dengan memahami peraturan ini dan perbezaan halus dalam promosi kaedah, pembangun boleh mengelakkan tingkah laku yang tidak dijangka dan mengekalkan kejelasan kod dalam program Go.
Atas ialah kandungan terperinci Mengapa Tidak Mengesan Kekaburan dalam String() Kaedah Invocation untuk Struktur Terbenam pada Masa Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!