英文:
How can we use the actual type pointed to by an empty interface to create a new instance of that type in Go?
问题
请检查下面的程序。变量z
的类型是interface{}
。它存储了结构体X
的类型。但是我无法使用它来创建X
的新实例。我有一些要求,需要将对象的类型保留在interface{}
变量中,并使用它来创建该类型的实例。这是一个在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) // 打印 main.X
// 下面的代码会抛出错误
fmt.Printf("%v\n", reflect.New(z)) //----> 这行代码会抛出错误
}
英文:
Please check the below program. Var z
is of type interface{}
. It stores the type of struct X
. But I cannot use it to create a new instance of X
. I have some requirement where I need to keep the type of the object in an interface{}
variable, and use that to create an instance of that type. Here is a 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
}
答案1
得分: 0
你可以使用type assertion从interface{}
值中提取reflect.Type
值:
fmt.Printf("%v\n", reflect.New(z.(reflect.Type))) //----> 可行!
你可以在Go Playground上查看修改后的示例。
请注意,上述示例在z
不包含reflect.Type
类型的值或为nil
时会引发恐慌。你可以使用特殊的逗号-ok形式来防止这种情况发生:
if t, ok := z.(reflect.Type); ok {
fmt.Printf("%v\n", reflect.New(t)) // t的类型是reflect.Type
} else {
fmt.Println("不是预期的类型或为nil!")
}
英文:
You can use type assertion to extract the reflect.Type
value from an interface{}
value:
fmt.Printf("%v\n", reflect.New(z.(reflect.Type))) //----> Works!
Your modified example on the Go Playground.
Note that the above example panics if z
does not hold a value of type reflect.Type
or if it is nil
. You can use the special comma-ok form to prevent that:
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!")
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论