【发布时间】:2016-09-24 21:21:10
【问题描述】:
是否有可能以及如何在不从类型创建对象并调用它reflect.TypeOf(obj)
java 中的内容是:MyType.class
【问题讨论】:
标签: reflection go
是否有可能以及如何在不从类型创建对象并调用它reflect.TypeOf(obj)
java 中的内容是:MyType.class
【问题讨论】:
标签: reflection go
您可以使用以下语法在不实例化的情况下实现此目的;
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()。
不,你不能直接拥有它,因为在 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
}
【讨论】: