Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencapai Salinan Dalam Nilai Antara Muka dalam Go?

Bagaimana untuk Mencapai Salinan Dalam Nilai Antara Muka dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-07 20:57:12739semak imbas

How to Achieve a Deep Copy of Interface Values in 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!

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