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.
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.
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
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) }
Dengan menggunakan refleksi, anda boleh mengendalikan kes di mana nilai dalam user1 bukan penunjuk.
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!