Pengklonan Struktur dengan Medan Tidak Dieksport
Dalam Go, struct dengan medan yang tidak dieksport memberikan cabaran untuk pengklonan objek. Pertimbangkan jenis yang ditakrifkan sebagai:
type T struct { S string is []int }
Tugasan mudah seperti di bawah tidak akan menghasilkan salinan bebas:
p := T{"some string", []int{10, 20}} q := p
Ini kerana medan jenis yang tidak dieksport (adalah) tidak boleh diakses dan tidak boleh disalin secara eksplisit.
Pengklonan melalui Tersuai Kaedah
Satu penyelesaian adalah dengan menyediakan kaedah Klon dalam pakej yang memiliki jenis tersebut. Walau bagaimanapun, ini hanya berfungsi untuk jenis dalam pakej yang sama.
Penghadan Jenis Pihak Ketiga
Jika jenis dengan medan yang tidak dieksport berada dalam pakej pihak ketiga, tiada cara langsung untuk mengklonkannya. Ini adalah reka bentuk, kerana medan yang tidak dieksport harus kekal peribadi kepada pakej pengisytiharan.
Pendekatan Alternatif
Walaupun tidak mungkin untuk mengklonkan medan yang tidak dieksport, adalah mungkin untuk mencipta struct baru dengan nilai kosong (sifar) untuk mereka medan:
var r somepackage.T s := somepackage.T{S: p.S}
Amalan Tidak Selamat
Menggunakan pakej tidak selamat tidak disyorkan untuk tujuan ini, kerana ia boleh membawa kepada tingkah laku yang tidak dijangka dan berpotensi tidak selamat.
Menyalin Medan Tidak Dieksport
Bila memberikan satu struct kepada yang lain daripada jenis yang sama, medan yang tidak dieksport akan disalin dengan betul. Walau bagaimanapun, mengubah suai medan tersebut tidak boleh dilakukan (ia hanya boleh menjadi sifar atau nilai penunjuk yang sama seperti yang asal).
type person struct { Name string age *int } age := 22 p := &person{"Bob", &age} p2 := new(person) *p2 = *p // Copy unexported field fmt.Println(p2) // Outputs: &{Bob 0x414020}
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengklon Go Structs dengan Medan Tidak Dieksport?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!