Go语言中通过reflect读取结构体标签可实现序列化、校验等功能,如解析json:”name”等标签,支持字段元信息操作。

在Go语言中,结构体标签(Struct Tag)是一种为字段附加元信息的方式,常用于序列化、数据库映射、参数校验等场景。通过反射(reflect),我们可以读取并解析这些标签内容。
结构体标签的基本写法
结构体标签是写在字段后面的字符串,通常以键值对形式出现,格式如下:
type User struct { Name string `json:"name" validate:"required"` Age int `json:"age" db:"user_age"`}
每个标签由多个键值对组成,用空格分隔,键和值之间用冒号连接,值用双引号包围。
使用 reflect 读取结构体标签
要获取结构体字段的标签,需使用 reflect.TypeOf 获取类型信息,再遍历字段。
立即学习“go语言免费学习笔记(深入)”;
示例代码:
package mainimport ( "fmt" "reflect")type User struct { Name string `json:"name" validate:"required"` Age int `json:"age" db:"user_age"`}func main() { var u User t := reflect.TypeOf(u) for i := 0; i < t.NumField(); i++ { field := t.Field(i) // 读取 json 标签 jsonTag := field.Tag.Get("json") // 读取 validate 标签 validateTag := field.Tag.Get("validate") // 读取 db 标签 dbTag := field.Tag.Get("db") fmt.Printf("字段: %sn", field.Name) fmt.Printf(" json: %sn", jsonTag) fmt.Printf(" validate: %sn", validateTag) fmt.Printf(" db: %sn", dbTag) }}
输出结果:
字段: Name json: name validate: required db: 字段: Age json: age db: user_age
解析标签中的多个属性
有时一个标签可能包含多个选项,例如 validate:”required,email”。这时可以用 strings.Split 进一步处理。
示例:
validate := field.Tag.Get("validate")if validate != "" { rules := strings.Split(validate, ",") for _, rule := range rules { fmt.Printf(" 校验规则: %sn", rule) }}
这样可以将 required,email 拆分为两个独立规则。
安全读取标签:检查结构体指针
如果传入的是结构体指针,需要先获取其元素类型。
改进后的通用方式:
func readTags(obj interface{}) { t := reflect.TypeOf(obj) // 如果是指针,获取指向的类型 if t.Kind() == reflect.Ptr { t = t.Elem() } if t.Kind() != reflect.Struct { fmt.Println("输入必须是结构体") return } for i := 0; i < t.NumField(); i++ { field := t.Field(i) jsonTag := field.Tag.Get("json") fmt.Printf("字段 %s 的 json 标签: %sn", field.Name, jsonTag) }}
基本上就这些。利用 reflect 包,可以灵活地读取和解析结构体标签,在开发框架或工具时非常实用。注意标签语法要正确,否则运行时无法解析。
以上就是Golang如何获取结构体标签_Golang reflect结构体Tag读取与解析方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1428224.html
微信扫一扫
支付宝扫一扫