我们如何使用空接口指向的实际类型在Go中创建该类型的新实例?

时间:2016-04-05 06:22:10

标签: reflection go interface

请检查以下程序。 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

}

1 个答案:

答案 0 :(得分:0)

您可以使用type assertionreflect.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!")
}