请检查以下程序。 Var z
的类型为interface{}
。它存储结构X
的类型。但我不能用它来创建X
的新实例。我有一些要求,我需要在interface{}
变量中保留对象的类型,并使用它来创建该类型的实例。这是link for the snippet on go playground
package main
import (
"fmt"
"reflect"
)
type X struct {
a int
b int
}
type MyInt int
func main() {
x := X{}
y := reflect.TypeOf(x)
fmt.Printf("%v\n", reflect.New(y))
var z interface{}
z = y
fmt.Printf("%v\n", z) // prints main.X
//Below line throws the error
fmt.Printf("%v\n", reflect.New(z)) //----> This line throws error
}
答案 0 :(得分:0)
您可以使用type assertion从reflect.Type
值中提取interface{}
值:
fmt.Printf("%v\n", reflect.New(z.(reflect.Type))) //----> Works!
您在Go Playground上的修改示例。
请注意,如果z
不包含reflect.Type
类型的值或nil
,则上述示例会发生混乱。您可以使用特殊的逗号表单来防止:
if t, ok := z.(reflect.Type); ok {
fmt.Printf("%v\n", reflect.New(t)) // t is of type reflect.Type
} else {
fmt.Println("Not the expected type or nil!")
}