Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencapai Salinan Dalam Nilai Antara Muka dalam Go?
Salinan Dalam Nilai Antara Muka dalam Go
Menyalin nilai antara muka terus dalam Go menghasilkan salinan cetek, bermakna perubahan dibuat pada yang disalin nilai mempengaruhi asal juga. Ini kerana antara muka mempunyai rujukan kepada jenis konkrit asas.
Punca Perubahan Nama
Untuk memahami isu dalam kod yang disediakan, mari analisa cara nilai antara muka berfungsi . Antara muka Pengguna mewakili kontrak dan kedua-dua Pentadbir dan Pengguna melaksanakan kontrak ini. Apabila menugaskan pengguna1 kepada pengguna2, kami pada asasnya membuat rujukan kepada contoh Pentadbiran yang sama. Mengubah suai kaedah Nama() pengguna secara langsung mengubah suai contoh Pentadbiran yang dikongsi, yang seterusnya menukar nama pengguna1 juga.
Penyelesaian dengan Refleksi
Untuk mencapai salinan yang mendalam, kami memerlukan untuk mencipta contoh baharu jenis konkrit asas dan membungkusnya dalam nilai antara muka Pengguna baharu. Satu cara untuk melakukan ini adalah dengan menggunakan refleksi. Kita boleh menggunakan fungsi reflect.ValueOf() dan reflect.Elem() untuk mendapatkan nilai asas yang disimpan dalam user1. Kemudian, kita boleh menggunakan reflect.New() untuk mencipta contoh baharu daripada jenis yang sama dan reflect.MethodByName() untuk mendapatkan kaedah Name(). Akhir sekali, kita boleh memanggil kaedah SetName() pada contoh baharu dan membungkusnya dalam nilai antara muka Pengguna baharu.
func CloneUser(user User) User { val := reflect.ValueOf(user) if val.Kind() != reflect.Ptr { panic("expected pointer") } elem := val.Elem() t := elem.Type() newElem := reflect.New(t).Elem() newElem.MethodByName("SetName").Call([]reflect.Value{reflect.ValueOf(newElem.String())}) return newElem.Interface().(User) }
Menggunakan fungsi ini, kita boleh mencipta salinan yang tidak menjejaskan asal:
var user2 User = CloneUser(user1) user2.SetName("user2") fmt.Println(user1.Name(), user2.Name()) // Outputs: user1 user2
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Salinan Dalam Nilai Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!