Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mencipta Salinan Benar Nilai Antara Muka dalam Go Apabila Berurusan dengan Rujukan Penunjuk?

Bagaimana untuk Mencipta Salinan Benar Nilai Antara Muka dalam Go Apabila Berurusan dengan Rujukan Penunjuk?

Patricia Arquette
Lepaskan: 2024-12-07 09:40:15
asal
690 orang telah melayarinya

How to Create True Copies of Interface Values in Go When Dealing with Pointer References?

Salin Berbanding Rujukan dalam Nilai Antara Muka

Dalam Go, anda mungkin menghadapi senario di mana anda perlu membuat salinan nilai antara muka untuk mengekalkan keadaan yang berbeza. Apabila menyalin nilai antara muka yang memegang rujukan penuding, adalah penting untuk mempertimbangkan implikasinya. Artikel ini meneroka cara mengendalikan senario sedemikian dan menyediakan teknik untuk membuat salinan sebenar.

Masalah: Berkongsi Nilai Melalui Rujukan Penunjuk

Dalam contoh yang diberikan, pengguna1 merujuk struct Pentadbir melalui penuding. Ini bermakna apabila anda menetapkan user1 kepada user2, anda pada asasnya membuat user2 menunjuk kepada struct Pentadbiran asas yang sama. Sebarang pengubahsuaian yang dibuat melalui sama ada pengguna1 atau pengguna2 akan menjejaskan struktur asal.

Penyelesaian 1: Menyalin Struktur Dasar Secara Eksplisit

Satu pendekatan untuk mencipta salinan yang berbeza adalah dengan menaip menegaskan nilai dalam user1, salin struct Pentadbiran asas, dan bungkus alamatnya dalam Pengguna baharu value:

var user2 User
padmin := user1.(*Admin) // Obtain *Admin pointer
admin2 := *padmin        // Make a copy of the Admin struct
user2 = &admin2          // Wrap its address in another User
Salin selepas log masuk

Penyelesaian 2: Menggunakan Refleksi

Untuk penyelesaian yang lebih generik, anda boleh memanfaatkan keupayaan refleksi Go untuk mendapatkan semula jenis asas, mencipta nilai baharu jenis itu secara dinamik dan bungkusnya dalam nilai Pengguna baharu:

if reflect.TypeOf(user1).Kind() == reflect.Ptr {
    // Pointer:
    user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User)
} else {
    // Not pointer:
    user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User)
}
Salin selepas log masuk

Dengan menggunakan refleksi, anda boleh mengendalikan kes di mana nilai dalam user1 bukan penunjuk.

Kesimpulan

Dalam kes di mana nilai antara muka perlu disalin dan kekal berbeza, adalah penting untuk mempertimbangkan dengan teliti jenis asas dan menggunakan teknik yang sesuai seperti salinan eksplisit atau refleksi untuk mencipta salinan sebenar. Pendekatan ini membolehkan anda mengubah suai satu salinan tanpa menjejaskan salinan asal.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Salinan Benar Nilai Antara Muka dalam Go Apabila Berurusan dengan Rujukan Penunjuk?. 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