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