使用反射附加到 Golang 切片:全面探索
问题陈述:
中Go,当尝试使用反射将元素附加到切片时,原始切片保持不变。下面的代码演示了这一点:
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 }
理解行为:
reflect.Append 函数的操作与内置追加函数类似,返回一个新的切片值。在提供的示例中,代码将返回值分配给appendToSlice函数内的value变量,有效地替换了之前的reflect.Value。但是,这不会修改原始参数。
使用反射追加的正确方法:
要使用反射将元素追加到原始切片,Value.Set应采用方法。以下是修改后的代码:
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }
通过使用 Value.Set,value 变量将使用附加的切片值进行更新,然后反映在 arrPtr 参数引用的原始切片中。
结论:
使用反射追加到Go切片需要使用Value.Set方法修改原始切片。 Reflect.Append 函数返回一个新的切片值,必须使用 Value.Set 将其分配给原始切片。这确保了反射范围内所做的更改反映在原始切片中。
以上是为什么 Reflection 的 `reflect.Append` 没有修改原来的 Go Slice,如何修复?的详细内容。更多信息请关注PHP中文网其他相关文章!