Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Fungsi `Lampirkan` Reflection Tidak Mengemas kini Go Slice Asal?

Mengapa Fungsi `Lampirkan` Reflection Tidak Mengemas kini Go Slice Asal?

Barbara Streisand
Barbara Streisandasal
2024-11-26 01:10:12552semak imbas

Why Doesn't Reflection's `Append` Function Update the Original Go Slice?

Tambah Fungsi dalam Go Reflection

Dalam Go, menambahkan elemen pada kepingan menggunakan pantulan nampaknya tidak mengemas kini kepingan asal. Ini digambarkan dalam kod berikut:

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()
    value = reflect.Append(value, reflect.ValueOf(55))

    fmt.Println(value.Len()) // prints 1
}

func main() {
    arr := []int{}
    appendToSlice(&arr)
    fmt.Println(len(arr)) // prints 0
}

Mengapa ia tidak berkesan?

Punca utama terletak pada tingkah laku refleksi.Lampirkan. Seperti fungsi tambahan konvensional, ia mengembalikan nilai kepingan baharu. Dalam kes ini, nilai yang diberikan kepada pembolehubah nilai digantikan dengan kepingan baharu ini, dengan berkesan mencipta salinan.

Untuk menggambarkan, mari kita ubah suai contoh untuk menyerlahkan perkara yang berlaku:

func appendToSlice(arrPtr *[]int) {
    value := *arrPtr
    value = append(value, 55)
    fmt.Println(len(value))
}

func main() {
    arr := []int{}
    appendToSlice(&arr)
    fmt.Println(len(arr))
}

Kod yang diubah suai ini menghasilkan output yang sama walaupun kami tidak menggunakan refleksi.

Penyelesaian

Untuk menambah dengan betul pada kepingan menggunakan pantulan, kita perlu menggunakan kaedah Value.Set untuk mengubah suai nilai asal:

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()

    value.Set(reflect.Append(value, reflect.ValueOf(55)))

    fmt.Println(value.Len())
}

Pendekatan ini menghantar kepingan yang baru dibuat kepada nilai. Tetapkan, mengemas kini kepingan asal.

Atas ialah kandungan terperinci Mengapa Fungsi `Lampirkan` Reflection Tidak Mengemas kini Go Slice Asal?. 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