Rumah > Artikel > pembangunan bahagian belakang > Mengapa Fungsi `Lampirkan` Reflection Tidak Mengemas kini Go Slice Asal?
Tambah Fungsi dalam Go Reflection
Dalam Go, menambahkan elemen pada kepingan menggunakan pantulan nampaknya tidak mengemas kini kepingan asal. Ini digambarkan dalam kod berikut:
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 }
Mengapa ia tidak berkesan?
Punca utama terletak pada tingkah laku refleksi.Lampirkan. Seperti fungsi tambahan konvensional, ia mengembalikan nilai kepingan baharu. Dalam kes ini, nilai yang diberikan kepada pembolehubah nilai digantikan dengan kepingan baharu ini, dengan berkesan mencipta salinan.
Untuk menggambarkan, mari kita ubah suai contoh untuk menyerlahkan perkara yang berlaku:
func appendToSlice(arrPtr *[]int) { value := *arrPtr value = append(value, 55) fmt.Println(len(value)) } func main() { arr := []int{} appendToSlice(&arr) fmt.Println(len(arr)) }
Kod yang diubah suai ini menghasilkan output yang sama walaupun kami tidak menggunakan refleksi.
Penyelesaian
Untuk menambah dengan betul pada kepingan menggunakan pantulan, kita perlu menggunakan kaedah Value.Set untuk mengubah suai nilai asal:
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }
Pendekatan ini menghantar kepingan yang baru dibuat kepada nilai. Tetapkan, mengemas kini kepingan asal.
Atas ialah kandungan terperinci Mengapa Fungsi `Lampirkan` Reflection Tidak Mengemas kini Go Slice Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!