moe*_*sef 2 reflection struct go slice go-reflect
我正在尝试从a创建一个切片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)
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下错误,我不知道如何解决它没有硬编码转换[]TestStruct.
prog.go:17: first argument to append must be slice; have interface {}
Run Code Online (Sandbox Code Playgroud)
无论如何将返回的接口视为切片而不必将转换硬编码interface{}为[]TestStruct?
不,你所描述的是不可能的.不要键入断言.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)
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/WkGPjv0m_P
小智 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
}
Run Code Online (Sandbox Code Playgroud)
2-使用reflect.New(reflect.SliceOf(elemType)).Elem()并
elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))
喜欢这个工作示例代码:
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}]
}
Run Code Online (Sandbox Code Playgroud)
输出:
[{TestStr:Testing}]
[{Testing}]
Run Code Online (Sandbox Code Playgroud)
3-如果您需要append,唯一的方法是使用s := elemSlice.([]TestStruct),就像这个工作示例代码:
[{TestStr:Testing}]
[{Testing}]
Run Code Online (Sandbox Code Playgroud)