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
DDDasal
2024-12-04 10:51:101004semak imbas

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
}

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())
}

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

1
1

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!

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