在Go中,我可以通过fmt.Printf("%T",Struct{})
打印一种类型的结构,但这会创建一个新结构,从而占用一个内存。所以我可能只打印fmt.Printf("main.Struct")
,但是假设有人重构了Struct
的名称,那么print语句不会更新并且代码会中断。
如何在不创建实例的情况下打印某种类型的结构?
答案 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:]