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!