gpt4 book ai didi

go - 如何 reflect.New slice 并将其 reflect.AppendSlice 到源 slice

转载 作者:IT王子 更新时间:2023-10-29 01:58:36 24 4
gpt4 key购买 nike

我想reflect.New 一个[]interface{},比如[]int,并将它追加到另一个 slice 中。

我的代码肯定有错误,但我不知道如何改正,也不知道如何深入理解reflect.Newreflect.AppendSlice的用法。

package main

import (
"fmt"
"reflect"
)

func main() {
var a []int
var value reflect.Value = reflect.ValueOf(&a)


if !value.CanSet() {
fmt.Println("go here", value.CanSet())
value = value.Elem()
fmt.Println("go here", value.CanSet())
}
fmt.Println("go here", value.Type())
s := reflect.New(value.Type())
fmt.Println("go here", s.Elem())
value = reflect.AppendSlice(value, reflect.ValueOf(s.Elem()))
value = reflect.AppendSlice(value, reflect.ValueOf([]int{1, 2}))
value = reflect.AppendSlice(value, reflect.ValueOf([]int{3, 4, 5, 6, 7, 8, 9}))

fmt.Println(value.Kind(), value.Slice(0, value.Len()).Interface())
//>>slice [1 2 3 4 5 6 7 8 9]
}

但是报错:

panic: reflect: call of reflect.AppendSlice on struct Value

goroutine 1 [running]:
panic(0x100a60, 0x1040e1a0)
/usr/local/go/src/runtime/panic.go:500 +0x720
reflect.flag.mustBe(0x99, 0x17)
/usr/local/go/src/reflect/value.go:201 +0xe0
reflect.AppendSlice(0xfa7e0, 0x1040e130, 0x197, 0x1116a0, 0x1040e190, 0x99, 0x0, 0x0, 0x0, 0x2)
/usr/local/go/src/reflect/value.go:1825 +0x60
main.main()
/tmp/sandbox476529744/main.go:21 +0x800

golang playground

最佳答案

panic 发生在这条线上:

value = reflect.AppendSlice(value, reflect.ValueOf(s.Elem()))

s.Elem() 是一个 reflect.Value。在对 AppendSlice 的调用中直接使用此值:

value = reflect.AppendSlice(value, s.Elem())

表达式 reflect.ValueOf(s.Elem())reflect.Value 返回 reflect.Value,而不是为底层 []int

playground example

关于go - 如何 reflect.New slice 并将其 reflect.AppendSlice 到源 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39192373/

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