go - 使用反射附加到 go lang slice

标签 go reflection

出于某种原因,使用反射向 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())
}

https://play.golang.org/p/Nhabg31Sju

关于go - 使用反射附加到 go lang slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42494333/

相关文章:

go - 如何禁止直接结构初始化

go - int64 的可变长度二进制补码

go - 无法将 !!seq 解码为 Go 中的字符串

java - 泛型和( super ?)类型标记可以帮助构建类型安全的新闻聚合器吗?

swift - 传递动态类型作为参数

reflection - 如何使用私有(private)构造函数反射(reflect)导入包中的类?

python - 去 "&^"算子,什么意思?

c# - 应用程序在运行时更改语言

java - 将值设置为原始类型字段

go - 如何从子目录中的 Controller 调用函数 - Golang