出于某种原因,似乎使用反射向切片添加新元素不会更新切片本身.这是演示的代码:
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
}
Run Code Online (Sandbox Code Playgroud)
游乐场链接:https://play.golang.org/p/j3532H_mUL
这里有什么我想念的吗?
Jim*_*imB 11
reflect.Append就像append它返回一个新的切片值一样.
您将此值分配给函数中的value变量,该变量appendToSlice将替换先前的变量reflect.Value,但不会更新原始参数.
为了更清楚地说明发生了什么,请在没有反射的情况下将等效函数用于示例:
func appendToSlice(arrPtr *[]int) {
value := *arrPtr
value = append(value, 55)
fmt.Println(len(value))
}
Run Code Online (Sandbox Code Playgroud)
您需要使用的是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())
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/Nhabg31Sju