首页 > 解决方案 > 在不使用 reflrect 的情况下打印类型并创建新对象

问题描述

在下面的代码中,为了显示预期的类型,我必须创建一个新对象并调用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{}{})
}

也许创建对象不是开销,但我仍然很想知道更好的方法。有类似X.getName()X.getSimpleName()在java中的东西吗?

标签: pointersgostructreflectiontypes

解决方案


要获取reflect.Type类型的描述符,您可以使用

reflect.TypeOf((*X)(nil)).Elem()

以避免必须创建 type 的值X。有关更多详细信息,请参阅这些问题:

如何获取类型的字符串表示?

Golang TypeOf 没有实例并将结果传递给 func

要打印某些值的类型,您可以使用fmt.Printf("%T, something).

实际上,对于您想做的事情,您可以完全将反思放在一边,只需执行以下操作:

fmt.Printf("Expecting type %T, got %T\n", (*X)(nil), something)

输出将是(在Go Playground上尝试):

Expecting type *main.X, got struct {}

推荐阅读