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

Mah*_*oni 3 reflection types go

假设我定义了以下类型:

type ID uuid.UUID
Run Code Online (Sandbox Code Playgroud)

我如何以编程方式获取字符串类型,以便以后可以轻松重构,而不是:

fmt.Sprintf("%T", ID{})
Run Code Online (Sandbox Code Playgroud)

我不太喜欢它,因为它也是从接口实例化它。

icz*_*cza 5

您可以使用包reflect(该fmt包也在幕后执行此操作)。您可以从指向类型的指针开始,并使用类型化的nil指针值而不进行分配,并且可以使用从其描述符导航到指针的基本类型(或元素reflect.Type类型)的描述符。Type.Elem()

例子:

t := reflect.TypeOf((*ID)(nil)).Elem()
name := t.Name()
fmt.Println(name)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

ID
Run Code Online (Sandbox Code Playgroud)

注意:请注意,Type.Name()可能会返回空string(如果Type表示未命名类型)。如果您使用类型声明(带有type关键字),那么您已经命名了该类型,因此Type.Name()将返回一个非空类型名称。*[]string但是,例如,将上面的代码用于类型变量将会给你一个空字符串:

var s *[]string
t := reflect.TypeOf(s).Elem()
name := t.Name()
fmt.Printf("%q", name)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上尝试):

""
Run Code Online (Sandbox Code Playgroud)

查看相关问题:

Golang Reflect:从名称获取类型表示?

使用 Reflect 识别非内置类型