Rumah > pembangunan bahagian belakang > Golang > Mengapa Tidak Mencerminkan.Lampirkan Ubah Suai Go Slice Asal, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Tidak Mencerminkan.Lampirkan Ubah Suai Go Slice Asal, dan Bagaimana Saya Boleh Membetulkannya?

DDD
Lepaskan: 2024-12-04 10:51:10
asal
1002 orang telah melayarinya

Why Doesn't Reflect.Append Modify the Original Go Slice, and How Can I Fix It?

Menambah pada Go Lang Slice Menggunakan Refleksi: Memahami Mekanik

Apabila cuba menambahkan elemen baharu pada kepingan menggunakan pantulan, ia adalah dijangka bahawa kepingan asal akan dikemas kini dengan sewajarnya. Walau bagaimanapun, mungkin diperhatikan bahawa ini tidak berlaku, seperti yang ditunjukkan dalam kod berikut:

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 Sebab

Kunci untuk memahami tingkah laku ini terletak dalam mengiktiraf bagaimana reflect.Append beroperasi. Sama seperti fungsi tambah dalam pustaka standard, reflect.Append mencipta nilai hirisan baharu dan bukannya mengubah suai yang asal. Dalam coretan kod di atas, nilai diberikan kepingan yang baru dibuat, yang menggantikan nilai asal dalam fungsi tetapi tidak menjejaskan hujah asal di luar fungsi.

Membetulkan Pendekatan

Untuk mengubah suai kepingan asal menggunakan pantulan, kaedah Value.Set harus digunakan. Kaedah ini membolehkan untuk mengemas kini nilai asal. Versi fungsi appendToSlice yang diperbetulkan ialah:

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

Ini memastikan kepingan asal diubah suai seperti yang dijangkakan dan output berikut diperoleh:

1
1
Salin selepas log masuk

Kesimpulan

Apabila menggunakan pantulan untuk mengubah suai kepingan, adalah penting untuk mempertimbangkan pantulan itu. Tambah membuat kepingan baharu bukan daripada mengubah suai yang asal. Dengan menggunakan kaedah Value.Set, seseorang boleh mengubah suai hirisan asal dengan berkesan menggunakan refleksi, memastikan hasil yang diharapkan tercapai.

Atas ialah kandungan terperinci Mengapa Tidak Mencerminkan.Lampirkan Ubah 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