在不创建实例的情况下打印结构类型

时间:2014-09-01 08:22:11

标签: go

在Go中,我可以通过fmt.Printf("%T",Struct{})打印一种类型的结构,但这会创建一个新结构,从而占用一个内存。所以我可能只打印fmt.Printf("main.Struct"),但是假设有人重构了Struct的名称,那么print语句不会更新并且代码会中断。

如何在不创建实例的情况下打印某种类型的结构?

2 个答案:

答案 0 :(得分:3)

其中一个解决方案是使用包reflect

fmt.Printf("%v", reflect.TypeOf((*Struct)(nil)).Elem())

不会创建任何结构实例。它将打印main.Struct

答案 1 :(得分:2)

总是使用reflect来获取类型名称,句点。

内部fmt.Printf("%T", x)使用reflect.TypeOf(x)(来源:http://golang.org/src/pkg/fmt/print.go#L721

使用可以使用fmt.Sprintf但它仍然使用反射+解析格式字符串的额外开销。

name := fmt.Sprintf("%T", (*S)(nil))[1:] //lose the *
// or
name := reflect.TypeOf((*S)(nil)).String()[1:]