使用反射附加到lang切片

agn*_*nor 2 reflection 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
}
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