繁体   English   中英

使用反射附加到切片

[英]Appending to a slice using reflection

我想仅使用反射附加到切片。 但我无法弄清楚如何“替换”的值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如果从非指针起源。 如果允许,则只能修改副本,并且会造成更多混乱。 切片值是一个标头,包含指向后备数组的指针,长度和容量。 当您传递a reflect.ValueOf() ,将生成并传递此标头的副本,并且您可以对其进行的任何修改都只能修改此标头副本。 原始切片标头不会观察到添加元素(从而改变其长度以及可能的指针和容量),原始切片仍将指向相同的数组,并且仍包含相同的长度和容量值。 有关详细信息,请参阅Golang函数参数是否以写时复制形式传递? ; Golang将数组传递给函数并对其进行修改

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

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

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

另外,要打印值的类型,请使用%T动词( %tbool值):

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中的反射为结构成员分配值

在带有反射的接口下更改指针类型和值

使用反射SetString

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM