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
Susan Sarandonasal
2024-12-23 14:09:17791semak imbas

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
}

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!

Kenyataan:
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