Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyalin Nilai Antara Muka dengan Betul dalam Go?

Bagaimana untuk Menyalin Nilai Antara Muka dengan Betul dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-11 01:35:13260semak imbas

How to Properly Copy Interface Values in 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!

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