从反射类型创建切片

6

我正在尝试从reflect.Type创建一个切片。这是我目前的代码。

package main

import (
    "fmt"
    "reflect"
)

type TestStruct struct {
    TestStr string
}

func main() {
    elemType := reflect.TypeOf(TestStruct{})

    elemSlice := reflect.New(reflect.SliceOf(elemType)).Interface()

    elemSlice = append(elemSlice, TestStruct{"Testing"})

    fmt.Printf("%+v\n", elemSlice)

}

然而,我遇到了以下错误,我不确定如何解决它,而不是硬编码转换为[]TestStruct
prog.go:17: first argument to append must be slice; have interface {}

有没有办法将返回的接口视为切片,而无需硬编码从interface {}转换为[]TestStruct

这实际上更符合我所寻找的内容。https://dev59.com/o18e5IYBdhLWcg3wwMv8 - moesef
2个回答

14

不,你所描述的是不可能的。不对.Interface()的结果进行类型断言会限制你的操作。你最好的选择是继续使用reflect.Value

不,你所描述的不可能。不对.Interface()的结果进行类型断言会限制你的操作。你最好的选择是继续使用reflect.Value值:
package main

import (
    "fmt"
    "reflect"
)

type TestStruct struct {
    TestStr string
}

func main() {
    elemType := reflect.TypeOf(TestStruct{})

    elemSlice := reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10)

    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))

    fmt.Printf("%+v\n", elemSlice)

}

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


然而,elemSlice仍然是reflect.Value类型。如何将其转换为实际的切片类型? - Kartavya Ramnani
elemSlice.Interface().([]TestStruct) - Gillespie

6

1- 使用 reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10)
reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))
像这样工作的示例代码:

package main

import "fmt"
import "reflect"

func main() {
    elemType := reflect.TypeOf(TestStruct{})
    elemSlice := reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10)
    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))
    fmt.Println(elemSlice) // [{Testing}]

}

type TestStruct struct {
    TestStr string
}

2- 使用reflect.New(reflect.SliceOf(elemType)).Elem()
elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"测试"}))
像这样的工作示例代码:

package main

import "fmt"
import "reflect"

type TestStruct struct {
    TestStr string
}

func main() {
    elemType := reflect.TypeOf(TestStruct{})
    elemSlice := reflect.New(reflect.SliceOf(elemType)).Elem()
    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))

    fmt.Printf("%+v\n", elemSlice) // [{TestStr:Testing}]
    fmt.Println(elemSlice)         // [{Testing}]
}

输出:

[{TestStr:Testing}]
[{Testing}]

如果你需要使用`append`,唯一的方法是使用`s := elemSlice.([]TestStruct)`,像这个可以工作的示例代码:
package main

import "fmt"
import "reflect"

type TestStruct struct {
    TestStr string
}

func main() {
    elemType := reflect.TypeOf(TestStruct{})
    elemSlice := reflect.New(reflect.SliceOf(elemType)).Elem().Interface()

    s := elemSlice.([]TestStruct)
    s = append(s, TestStruct{"Testing"})

    fmt.Printf("%+v\n", elemSlice) // []
    fmt.Println(s)                 // [{Testing}]
}

所以对于问题#3,您仍需要写出实际的单词“TestStruct”。 - huggie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接