Mengapa `reflect.Append` Reflection tidak mengubah suai Go Slice Asal dan Bagaimana Saya Boleh Membetulkannya?

DDD
Lepaskan: 2024-11-23 09:49:18
asal
881 orang telah melayarinya

Why Doesn't Reflection's `reflect.Append` Modify the Original Go Slice, and How Can I Fix It?

Memampirkan Hirisan Golang menggunakan Refleksi: Penerokaan Komprehensif

Pernyataan Masalah:

Dalam Pergi, apabila cuba menambahkan elemen pada kepingan menggunakan pantulan, kepingan asal kekal tidak berubah. Ini ditunjukkan dalam kod di bawah:

package main

import (
    "fmt"
    "reflect"
)

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
}
Salin selepas log masuk

Memahami Gelagat:

Fungsi reflect.Append beroperasi sama dengan fungsi append terbina dalam dengan mengembalikan a nilai kepingan baharu. Dalam contoh yang diberikan, kod memberikan nilai yang dikembalikan kepada pembolehubah nilai dalam fungsi appendToSlice, dengan berkesan menggantikan reflect.Value sebelumnya. Walau bagaimanapun, ini tidak mengubah hujah asal.

Pendekatan Betul untuk Menambah Menggunakan Refleksi:

Untuk menambahkan elemen pada kepingan asal menggunakan pantulan, Value.Set kaedah harus digunakan. Berikut ialah kod yang diubah suai:

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

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

    fmt.Println(value.Len())
}
Salin selepas log masuk

Dengan menggunakan Value.Set, pembolehubah nilai dikemas kini dengan nilai kepingan yang dilampirkan, yang kemudiannya mencerminkan dalam kepingan asal yang dirujuk oleh argumen arrPtr.

Kesimpulan:

Menambah hirisan Go menggunakan pantulan memerlukan menggunakan kaedah Value.Set kepada ubah suai kepingan asal. Fungsi reflect.Append mengembalikan nilai kepingan baharu, yang mesti diberikan kepada kepingan asal menggunakan Value.Set. Ini memastikan bahawa perubahan yang dibuat dalam skop pantulan ditunjukkan dalam kepingan asal.

Atas ialah kandungan terperinci Mengapa `reflect.Append` Reflection tidak mengubah suai Go Slice Asal dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan