Go语言如何无需实例化struct即可获取其字段的tag标签值
Go语言无需实例化结构体读取字段tag的实现方法
可以在完全不实例化结构体、不分配结构体内存的前提下读取字段tag值,实现方案如下:
原示例代码的问题
你给出的示例代码reflect.TypeOf(User{})实际隐式实例化了一个User类型的零值对象,虽然结构体本身内存开销不大,但确实属于实例化操作。
无实例化的实现方案
利用空结构体指针获取类型元信息即可,全程不会触发结构体实例化:
完整示例代码
package main import "reflect" type User struct { Name string `json:"name" validate:"required"` Age int `json:"age" validate:"gte=0"` } func main() { // 传入指向User的空指针,不会分配结构体内存,无实例化操作 userType := reflect.TypeOf((*User)(nil)).Elem() // 遍历所有字段读取tag for i := 0; i < userType.NumField(); i++ { field := userType.Field(i) jsonTag := field.Tag.Get("json") validateTag := field.Tag.Get("validate") println("字段名:", field.Name, "json标签:", jsonTag, "validate标签:", validateTag) } // 单独读取指定字段的tag nameField, _ := userType.FieldByName("Name") println("单独获取Name字段的json标签:", nameField.Tag.Get("json")) }
原理解释
(*User)(nil)只会创建一个*User类型的空指针,仅占用指针本身的极小空间,不会初始化结构体的任何字段,也不会分配结构体对应的内存空间- 结构体的字段、标签等元信息是编译期就确定并存储在程序静态区的,不需要依赖实例化对象就可以通过类型元信息直接读取
内容的提问来源于stack exchange,提问作者Lucas Hernandes
相关产品推荐
相关产品推荐

