Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyalin Nilai Antara Muka dengan Betul dalam Go?
Menyalin Nilai Antara Muka dalam Go
Apabila bekerja dengan antara muka dalam Go, anda mungkin menghadapi senario di mana anda perlu membuat salinan nilai antara muka. Kelakuan menyalin nilai antara muka berbeza bergantung pada jenis asas antara muka.
Menyalin Antara Muka Penunjuk
Dalam contoh anda, antara muka Pengguna mempunyai jenis penuding. Apabila anda menetapkan satu pembolehubah Pengguna kepada yang lain, nilai penunjuk asas disalin. Ini bermakna kedua-dua yang asal dan salinan menghala ke data asas yang sama. Sebarang pengubahsuaian yang dibuat melalui mana-mana pembolehubah akan ditunjukkan dalam kedua-duanya.
type User interface { Name() string SetName(name string) } type Admin struct { name string } func (a *Admin) Name() string { return a.name } func (a *Admin) SetName(name string) { a.name = name } func main() { var user1 User user1 = &Admin{name: "user1"} var user2 User user2 = user1 user2.SetName("user2") fmt.Println("User1's name:", user1.Name()) // "user2" fmt.Println("User2's name:", user2.Name()) // "user2" }
Dalam contoh ini, pengubahsuaian pengguna2 mempengaruhi pengguna1 juga. Ini kerana kedua-dua pengguna1 dan pengguna2 menunjuk kepada contoh Pentadbir yang sama.
Penyelesaian: Mengklonkan Nilai Asas
Untuk mencipta salinan sebenar nilai antara muka, anda perlu untuk mengklonkan data asas. Salah satu cara untuk mencapai ini adalah dengan menggunakan refleksi. Berikut ialah contoh:
var user3 User typ := reflect.TypeOf(user1) val := reflect.ValueOf(user1) if typ.Kind() == reflect.Ptr { newPtr := reflect.New(typ.Elem()) newPtr.Elem().Set(val.Elem()) user3 = newPtr.Interface().(User) } else { newVal := reflect.New(typ) newVal.Elem().Set(val) user3 = newVal.Elem().Interface().(User) } user3.SetName("user3") fmt.Println("User1's name:", user1.Name()) // "user1" fmt.Println("User3's name:", user3.Name()) // "user3"
Kod ini mencipta tika baharu jenis asas, mengklon data dan membungkusnya dalam antara muka Pengguna baharu. Sekarang, sebarang pengubahsuaian pada user3 tidak akan menjejaskan pengguna1.
Atas ialah kandungan terperinci Bagaimana untuk Menyalin Nilai Antara Muka dengan Betul dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!