使用反射附加到Golang 切片:全面探索
問題陳述:
問題陳述: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 }
問題陳述:
問題陳述:
問題陳述:
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }問題陳述:
問題陳述:問題陳述:中GoGo🎜>中Go ,當嘗試使用反射將元素附加到切片時,原始切片保持不變。下面的程式碼示範了這一點:理解行為:reflect.Append 函數的操作與內建追加函數類似,傳回一個新的切片值。在提供的範例中,程式碼將返回值分配給appendToSlice函數內的value變量,有效地替換了先前的reflect.Value。但是,這不會修改原始參數。 使用反射追加的正確方法:要使用反射將元素追加到原始切片,Value.Set應採用方法。以下是修改後的程式碼:透過使用 Value.Set,value 變數將使用附加的切片值進行更新,然後反映在 arrPtr 參數引用的原始切片中。 結論:使用反射追加到Go切片需要使用Value.Set方法修改原始切片。 Reflect.Append 函數傳回一個新的切片值,必須使用 Value.Set 將其指派給原始切片。這確保了反射範圍內所做的變更反映在原始切片中。
以上是為什麼 Reflection 的 `reflect.Append` 沒有修改原來的 Go Slice,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!