从反射类型创建切片
Creating Slice from Reflected Type
我正在尝试从 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
的转换进行硬编码?
不,你所描述的是不可能的。不键入断言 .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)
}
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{"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}]
}
输出:
[{TestStr:Testing}]
[{Testing}]
3- 如果你需要 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}]
}
我正在尝试从 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
的转换进行硬编码?
不,你所描述的是不可能的。不键入断言 .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)
}
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{"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}]
}
输出:
[{TestStr:Testing}]
[{Testing}]
3- 如果你需要 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}]
}