知道反射类型

时间:2015-06-04 05:58:24

标签: reflection go

在功能上,我传递的论据之一

reflect.TypeOf(Person)

其中person为struct且字符串很少。如果另一个接受这个参数的函数,我想要实例化这个空结构,知道它的反射类型。

我试过以下

ins := reflect.New(typ)  //typ is name or passed reflect.TypeOf(Person)

但这会让我回复nil。我做错了什么?

1 个答案:

答案 0 :(得分:2)

要告诉您的错误,我们应该看到更多代码。但这是一个如何做你想做的简单例子:

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{}

    p2 := create(reflect.TypeOf(p))

    p3 := p2.(*Person)
    p3.Name = "Bob"
    p3.Age = 20
    fmt.Printf("%+v", p3)
}

func create(t reflect.Type) interface{} {
    p := reflect.New(t)
    fmt.Printf("%v\n", p)

    pi := p.Interface()
    fmt.Printf("%T\n", pi)
    fmt.Printf("%+v\n", pi)

    return pi
}

输出(Go Playground):

<*main.Person Value>
*main.Person
&{Name: Age:0}
&{Name:Bob Age:20}

reflect.New()返回reflect.Value的值。返回的Value表示指向指定类型的新零值的指针。

您可以使用Value.Interface()来提取指针。

Value.Interface()返回interface{}类型的值。显然它不能返回任何具体类型,只是一般的空接口。空接口不是struct,因此您无法引用任何字段。但它可能(在你的情况下确实如此)保持*Person的值。您可以使用Type assertion获取*Person类型的值。