在不使用反射的情况下打印类型并创建新对象

时间:2018-10-26 09:24:09

标签: pointers go struct reflection types

在下面的代码中,为了显示期望的类型,我必须创建一个新对象并在其上调用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()的东西?

2 个答案:

答案 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)