【问题标题】:golang get the reflect.Type of a typegolang 获取一个类型的reflect.Type
【发布时间】:2016-09-24 21:21:10
【问题描述】:

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

的情况下获取类型的reflect.Type

java 中的内容是:MyType.class

【问题讨论】:

    标签: reflection go


    【解决方案1】:

    您可以使用以下语法在不实例化的情况下实现此目的;

    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

    【讨论】:

    • 如果你想为Test而不是*Test获取Type,你可以在Type返回的Type上调用.Elem()
    【解决方案2】:

    不,你不能直接拥有它,因为在 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
    }
    

    【讨论】:

    • 好答案,但第一个代码块有错字,应该是“t := reflect.TypeOf(obj)”
    猜你喜欢
    • 2021-08-15
    • 2011-09-17
    • 2015-07-10
    • 2018-12-24
    • 2013-10-23
    • 2011-10-31
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多