结构体标签是附着在字段后的元数据字符串,由下游库通过反射读取并解释,实现json映射、数据库列绑定、表单验证等解耦配置。

Go语言中结构体标签(Tag)本身不执行任何逻辑,它只是附着在字段后的元数据字符串,真正起作用的是下游库(如encoding/json、gorm、sqlx等)通过反射读取并按约定解释这些字符串。它的核心价值在于解耦——结构体定义不变,仅靠修改标签就能适配不同数据源的字段命名、行为规则或约束条件。
JSON序列化与反序列化映射
这是最常见也最直观的应用。json标签控制Go字段如何转成JSON键,以及如何从JSON还原。
-
重命名字段:Go习惯用
UserName,但API要求user_name,写json:"user_name"即可 -
忽略敏感字段:密码字段加
json:"-",序列化时直接跳过,不暴露也不报错 -
零值省略:如
Email string `json:"email,omitempty"`,当Email为空字符串时,JSON中不出现该字段 -
组合使用:例如
CreatedAt time.Time `json:"created_at,omitempty,string"`,既省略零值,又将时间转为字符串格式
数据库字段映射(ORM与SQL工具)
不同数据库驱动或ORM对标签的解析方式不同,但目标一致:让结构体字段和数据库列建立可配置的对应关系。
-
列名映射:GORM用
gorm:"column:user_name",sqlx用db:"username",避免结构体命名与DB列名强绑定 -
类型与约束声明:GORM支持
type:varchar(255)、not null、check:age > 0等,这些都在运行前由库解析并生成建表语句或校验逻辑 -
主键与自增:如
ID uint `gorm:"primaryKey;autoIncrement"`,替代硬编码逻辑,提升可移植性 -
忽略字段不入库:类似JSON的
-,GORM中可用gorm:"-"跳过字段插入/更新
表单绑定与验证场景
Web框架(如Gin、Echo)常借助结构体标签完成HTTP请求参数到结构体的自动填充与校验。
-
form标签指定表单字段名:前端提交
user_email,结构体字段写Email string `form:"user_email"`即可自动绑定 -
验证规则内嵌:如
validate:"required,email"或binding:"required",框架在绑定时触发校验,失败返回明确错误 -
多来源兼容:一个结构体可同时带
json、form、validate标签,分别服务API响应、表单提交、业务校验,无需重复定义
自定义标签与反射实践
当标准库或第三方包无法满足需求时,可定义专属标签,配合reflect包实现通用逻辑。
-
读取任意键值:用
reflect.TypeOf(u).Field(i).Tag.Get("mytag")获取自定义值,比如用于日志脱敏标记 -
多标签共存:同一字段可写
`json:"id" db:"uid" validate:"gt=0"`,各系统只取自己关心的部分,互不干扰 - 注意导出性:只有首字母大写的导出字段才能被反射读取,小写字段即使有标签也无法访问
-
引号与空格规范:标签必须是单行反引号字符串;键值对之间用空格分隔;value含空格需用双引号包裹,如
desc:"user name"
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











