gpt4 book ai didi

go - 使用反射附加到 slice

转载 作者:数据小太阳 更新时间:2023-10-29 03:12:43 24 4
gpt4 key购买 nike

我想仅使用反射附加到 slice 。但我不知道如何用新 slice “替换”a 的值。

func main() {
fmt.Println("Hello, playground")

a := []string {"a","b","c"}

values := []string {"d","e"}

v := reflect.ValueOf(a)

fmt.Printf("%t\n\n", v.Type())
fmt.Printf("%t\n\n", v.Type().Elem().Kind())

for _, val := range values {
v.Set(reflect.Append(v, reflect.ValueOf(val)))
}

fmt.Printf("%t - %v", a, a)
}

此代码可用于摆弄 https://play.golang.org/p/cDlyH3jBDS .

最佳答案

你不能修改包裹在reflect.Value中的值如果它源自非指针。如果允许的话,你只能修改一个副本,会造成更多的困惑。 slice 值是包含指向支持数组的指针、长度和容量的 header 。当您将 a 传递给 reflect.ValueOf() 时,会制作并传递此 header 的副本,您可以对其进行的任何修改都只能修改此 header 副本.添加元素(并因此改变其长度并可能改变其指针和容量)不会被原始 slice header 观察到,原始 slice 仍将指向相同的数组,并且仍将包含相同的长度和容量值。详情见Are Golang function parameter passed as copy-on-write? ;和 Golang passing arrays to the function and modifying it .

你必须从一个指针开始,你可以使用Value.Elem()获取指向的取消引用值的 reflect.Value 描述符。但是你必须从一个指针开始。

更改代码中的这一行使其工作:

v := reflect.ValueOf(&a).Elem()

要打印值的类型,请使用 %T 动词(%t 用于 bool 值):

fmt.Printf("%T\n\n", v.Type())
fmt.Printf("%T\n\n", v.Type().Elem().Kind())

// ...

fmt.Printf("%T - %v", a, a)

输出(在 Go Playground 上尝试):

Hello, playground
*reflect.rtype

reflect.Kind

[]string - [a b c d e]

要更深入地了解 Go 的反射,请阅读博文:The Laws of Reflection

并阅读相关问题+答案:

Assigning a value to struct member through reflection in Go

Changing pointer type and value under interface with reflection

Using reflection SetString

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com