golang得到一个类型的reflect.Type

时间:2016-05-26 18:09:34

标签: reflection go

是否有可能以及如何获取类型的reflect.Type而不从类型创建对象并调用它reflect.TypeOf(obj)

java中的内容:MyType.class

2 个答案:

答案 0 :(得分:8)

您无需使用以下语法进行实例化即可实现此目的;

package main

import (
    "fmt"
    "reflect"
)

type Test struct {
}


func main() {
    fmt.Println(reflect.TypeOf((*Test)(nil)).Elem())
}

播放; https://play.golang.org/p/SkmBNt5Js6

此外,它在这里的反映例子中得到了证明; https://golang.org/pkg/reflect/#example_TypeOf

答案 1 :(得分:3)

不,你不能直接拥有它,因为在Go结构中没有可访问的字段来获取它们的类型。

可以考虑通过执行以下操作来调整它:

type object struct {}

func main() {
    var obj object
    t := reflect.TypeOf(object)
    fmt.Println(t)
    // main.object
}

然而,在Go中,每个变量都使用零值进行初始化,因此这完全等同于:

t := reflect.TypeOf(object{})
// main.object

如果查看Golang的源代码,您会发现reflect.Type是根据类型实现不同的接口,但是您无法访问这些信息。

但是,您可以做的是获取指向结构的指针的类型,然后从中获取实际类型。该过程是相同的,除了指针的零值为nil,因此实例化所需的时间更短:

func main() {
    ptr_t := reflect.TypeOf((*object)(nil))
    fmt.Println(ptr_t)
    // *main.object

    t := ptr_t.Elem()
    fmt.Println(t)
    // main.object
}