出于某种原因,使用反射向 slice 添加新元素似乎不会更新 slice 本身。这是要演示的代码:
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
}
Playground 链接:https://play.golang.org/p/j3532H_mUL
我在这里遗漏了什么吗?
最佳答案
reflect.Append
的工作方式类似于 append
,因为它返回一个新的 slice 值。
你在appendToSlice
函数中将这个值赋给value
变量,它取代了之前的reflect.Value
,但不会更新原论点。
为了更清楚地说明发生了什么,请在不进行反射的情况下采用与您的示例等效的功能:
func appendToSlice(arrPtr *[]int) {
value := *arrPtr
value = append(value, 55)
fmt.Println(len(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())
}
关于go - 使用反射附加到 go lang slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494333/