在下面的代码中,为了显示期望的类型,我必须创建一个新对象并在其上调用reflect.TypeOf
。
package main
import (
"fmt"
"reflect"
)
type X struct {
name string
}
func check(something interface{}) {
if _, ok := something.(*X); !ok {
fmt.Printf("Expecting type %v, got %v\n",
reflect.TypeOf(X{}), reflect.TypeOf(something))
}
}
func main()
check(struct{}{})
}
也许对象创建不是开销,但是我仍然很好奇知道更好的方法。 Java中是否有类似X.getName()
或X.getSimpleName()
的东西?
答案 0 :(得分:3)
要获取类型的reflect.Type
描述符,可以使用
reflect.TypeOf((*X)(nil)).Elem()
避免创建类型为X
的值。有关更多详细信息,请参见以下问题:
How to get the string representation of a type?
Golang TypeOf without an instance and passing result to a func
要打印某些值的类型,可以使用fmt.Printf("%T, something)
。
实际上,对于您想做的事情,您可以将反射完全放在一边,简单地做一下:
fmt.Printf("Expecting type %T, got %T\n", (*X)(nil), something)
输出将是(在Go Playground上尝试):
Expecting type *main.X, got struct {}
答案 1 :(得分:0)
使用反射几乎总是一个错误的选择。您可以考虑使用以下方法之一
如果要根据类型控制流,可以使用switch
构造
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Printf("Twice %v is %v\n", v, v*2)
case string:
fmt.Printf("%q is %v bytes long\n", v, len(v))
default:
fmt.Printf("I don't know about type %T!\n", v)
}
}
fmt
包如果只想显示其类型,则可以始终使用fmt
包
i := 1000
fmt.Printf("The type is %T", i)