Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengklon Go Structs dengan Medan Tidak Dieksport?

Bagaimanakah Saya Boleh Mengklon Go Structs dengan Medan Tidak Dieksport?

Susan Sarandon
Lepaskan: 2024-12-23 14:09:17
asal
777 orang telah melayarinya

How Can I Clone Go Structs with Unexported Fields?

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
}
Salin selepas log masuk

Tugasan mudah seperti di bawah tidak akan menghasilkan salinan bebas:

p := T{"some string", []int{10, 20}}
q := p
Salin selepas log masuk

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}
Salin selepas log masuk

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}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan