Permulaan Struktur dengan Struktur Terbenam dalam Go
Mengarang struct ialah amalan biasa dalam organisasi kod dan penggunaan semula Go for. Walau bagaimanapun, memulakan struct yang digubah boleh memberikan cabaran apabila subfield diwarisi daripada struct terbenam.
Pertimbangkan contoh berikut:
type Base struct { ID string } type Child struct { Base a int b int }
Untuk memulakan Child, seseorang mungkin mengharapkan untuk menggunakan yang berikut sintaks:
child := Child{ ID: id, a: a, b: b }
Walau bagaimanapun, ini akan mengakibatkan ralat kompilasi disebabkan ID medan yang tidak diketahui dalam struct Kanak-kanak literal. Untuk menyelesaikan isu ini, medan ID mesti dimulakan secara berasingan:
child := Child{ a: 23, b: 42 } child.ID = "foo"
Pendekatan ini melanggar prinsip enkapsulasi dengan mendedahkan fakta bahawa ID ialah medan terbenam. Ia juga memperkenalkan risiko memecahkan permulaan jika medan awam dialihkan ke dalam struktur terbenam.
Untuk menangani isu ini, terdapat dua penyelesaian yang disyorkan:
Tersurat Komposit Bersarang:
Tersurat komposit bersarang boleh digunakan untuk memulakan tertanam medan dalam satu ungkapan:
child := Child{Base: Base{ID: id}, a: a, b: b}
Cadangan Perubahan dalam Go:
Go isu 9859 mencadangkan perubahan untuk membuat literal komposit selaras dengan akses medan untuk jenis terbenam. Jika dilaksanakan, perubahan ini akan membenarkan sintaks berikut:
child := Child{ ID: id, a: a, b: b }
Adalah penting untuk ambil perhatian bahawa jenis terbenam tidak menyediakan enkapsulasi dalam erti kata sebenar. Aplikasi masih boleh mengakses terus child.Base.ID walaupun menggunakan sintaks child.ID.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memulakan Struktur Terbenam dengan Cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!