Go struct tag 速查
json/yaml/db/form/validate tag · 点击复制
json/yaml/db/form/validate tag · 点击复制
在 Go 结构体里手写 json、yaml 或 db 标签,改一个字段名就得同步改四五处,漏一处就序列化失败。这个工具把结构体定义贴进去,一次生成 json、yaml、db、form、validate 五种标签,字段名、类型、嵌套层级自动对应,validate 标签按常见校验规则预填。所有解析和拼接都在浏览器本地完成,结构体定义不会离开设备。
后端定义了一个 18 个字段的 UserProfile 结构体,前端要求 json 字段为驼峰,DBA 要求 db 字段为下划线,验证层需要 validate 标签。手动写 18 组标签,漏一个就联调失败。把结构体粘贴进本工具,勾选 json、db、validate,一次生成全部标签,字段名、类型、长度全部对齐,联调零返工。
团队用 proto 定义服务,但部分遗留接口仍用 Go struct 手写。每次接口变更,要把新增字段的 json 标签、form 标签、校验规则逐一补到文档示例里,漏一个字段前端就报 400。把变更后的 struct 贴进来,勾选 json+form+validate,直接复制标签粘贴到代码,文档示例跟着更新,不遗漏。
旧项目用 gorm,新项目切到 sqlx,所有 Model 的 db 标签要从 gorm 的 column 格式改成 sqlx 的 db 格式。200 个字段手动改,漏一个就查半天。把整个 Model struct 粘贴,选 db 标签生成,直接覆盖原标签行,字段名、类型完全一致,迁移后首次查询全部通过。
注册页有 12 个输入框,邮箱、手机号、密码强度、年龄范围各需不同 validate 标签。手写时容易把 max=120 写成 1200,或者漏掉 required。把结构体字段和类型粘贴进本工具,勾选 validate,输出标签直接复制到代码,校验规则与字段类型自动匹配,上线后零校验漏洞。
开发、测试、生产三个环境的配置结构体字段完全一致,但 yaml 标签的命名规范不同(dev 用驼峰,prod 用下划线)。每次新增配置项,要手动写三套 yaml 标签,写错一个环境就加载失败。把结构体粘贴,分别选 yaml 标签生成,三套标签一次搞定,字段名与环境规范严格对应。
| 输入 | 输出 | 说明 |
|---|---|---|
| type User struct { Name string Age int } | type User struct { Name string `json:"name"` Age int `json:"age"` } | 常规:最基础的 json tag 生成,验证字段名自动转小写驼峰 |
| type Config struct { DBHost string `json:"db_host"` DBPort int `yaml:"db_port"` DebugMode bool `form:"debug"` } | type Config struct { DBHost string `json:"db_host" yaml:"db_host" form:"db_host" validate:"-"` DBPort int `json:"db_port" yaml:"db_port" form:"db_port" validate:"-"` DebugMode bool `json:"debug_mode" yaml:"debug_mode" form:"debug" validate:"-"` } | 边界:输入已有部分 tag,工具应保留已有 tag 并追加缺失 tag,不覆盖 |
| type Empty struct {} | type Empty struct {} | 边界:空结构体,工具应返回原样,不报错也不添加任何 tag |
| type Person struct { Email string `validate:"required,email"` Phone string `validate:"required"` } | type Person struct { Email string `json:"email" yaml:"email" form:"email" validate:"required,email"` Phone string `json:"phone" yaml:"phone" form:"phone" validate:"required"` } | 易错:validate tag 已有自定义规则时,工具应追加 json/yaml/form 但保留原 validate 内容,不覆盖 |
| type Data struct { Value interface{} `json:"-"` Count int `json:"-"` } | type Data struct { Value interface{} `json:"-" yaml:"-" form:"-" validate:"-"` Count int `json:"-" yaml:"-" form:"-" validate:"-"` } | 边界:json 用 '-' 忽略字段,工具应同步为所有 tag 加 '-',保持忽略语义一致 |
| type Product struct { ID int64 `gorm:"primaryKey"` CreatedAt time.Time } | type Product struct { ID int64 `json:"id" yaml:"id" form:"id" validate:"-" gorm:"primaryKey"` CreatedAt time.Time `json:"created_at" yaml:"created_at" form:"created_at" validate:"-"` } | 常规:混合已有 gorm tag 与无 tag 字段,验证工具能正确追加 json/yaml/form/validate 并保留 gorm |
| type Bad struct { Name string `json:"name"` Name string `json:"name"` } | type Bad struct { Name string `json:"name" yaml:"name" form:"name" validate:"-"` Name string `json:"name" yaml:"name" form:"name" validate:"-"` } | 易错:重复字段名(编译合法但逻辑错误),工具应正常处理每条字段,不报错也不合并 |
1.结构体字段未导出,tag 不生效
type User struct { name string `json:"name"` }type User struct { Name string `json:"name"` }Go 的反射只能访问大写开头的导出字段。小写字段的 tag 被编译器忽略,序列化时直接跳过。
2.validate tag 使用非标准标签名
`validate:"required,email"``validate:"required,email"`(使用 go-playground/validator 时正确)标准库 encoding/json 不处理 validate。若使用第三方验证库,必须确保标签名与库注册的标签名一致,否则验证被静默跳过。
3.yaml tag 误用 json 风格
`yaml:"user_name,omitempty"`(期望忽略空值)`yaml:"user_name,omitempty"`(yaml v3 支持 omitempty)gopkg.in/yaml.v3 的 omitempty 行为与 encoding/json 类似,但 yaml.v2 不支持 omitempty。需要确认使用的 yaml 库版本。
4.form tag 与 gin 绑定标签混淆
`form:"user_name"`(期望 gin 自动绑定)`form:"user_name"`(gin 默认使用 form 标签)gin 的 ShouldBind 默认读取 form 标签,而非 json。若同时需要 JSON 和表单绑定,应分别写 json 和 form 两个 tag。
5.db tag 未指定数据库方言
`db:"name"`(期望 ORM 自动处理)`db:"name"`(配合 xorm 时需额外指定列类型)不同 ORM(gorm/xorm/beego)对 db 标签的解析规则不同。gorm 使用 column 标签,xorm 使用 db 标签,混用会导致字段映射失败。
6.多个 tag 间缺少空格或分隔符
`json:"name"validate:"required"``json:"name" validate:"required"`Go 的 struct tag 本质是反引号包裹的字符串,多个 tag 之间必须用空格分隔。缺少空格时编译器会视为一个无效的 tag 名。
7.json tag 中 omitempty 对零值无效
`json:"count,omitempty"` 期望 int(0) 被忽略使用指针 *int 或自定义类型encoding/json 的 omitempty 对零值(0、false、空字符串)不会忽略,仅对 nil 指针和空切片/map 生效。
8.validate tag 中嵌套结构体未加 dive
`validate:"required"` 用于嵌套结构体字段`validate:"required,dive"`go-playground/validator 对嵌套结构体需要显式添加 dive 关键字,否则只校验外层结构体,内部字段的验证规则被忽略。
tag = `key:"value"`
keytag 类型,如 json、yaml、dbvalue字段名或约束,如 field_name、requiredGo 结构体字段 UserName,选择 json 和 validate 两种 tag:json 的 value 为 user_name(蛇形命名),validate 的 value 为 required,min=3,max=50。生成结果:`json:"user_name" validate:"required,min=3,max=50"`。
生成的 tag 格式符合标准 Go 库惯例,json 对应 encoding/json,yaml 对应 gopkg.in/yaml.v3,validate 对应 go-playground/validator。直接复制到 struct 字段上方即可,无需手动修改。但注意 validate tag 的规则(如 required、min、max)需要根据业务逻辑确认是否适用,工具只生成结构骨架,不判断字段的业务校验逻辑。
本工具完全在浏览器本地运行,不会读取或修改用户已有的代码文件。操作流程是:用户在输入框粘贴 struct 代码 → 点击生成 → 工具解析字段名和类型 → 输出带 tag 的完整 struct 文本。用户需要手动复制结果覆盖原代码。如果只想生成缺失的 tag,可以只复制新增字段的 struct 片段,工具不会自动合并已有内容。
最常见原因是输入的代码不符合 Go 语法规范,例如缺少字段类型、花括号不匹配、或混入了非 Go 语言的注释符号。本工具依赖前端解析器按标准 Go 语法解析,遇到非法输入会静默失败。建议检查:每个字段行是否包含字段名 + 类型(如 Name string),是否误用了单引号或中文冒号。如果代码较长,可以先截取一个最小的 struct 测试。
这是工具默认的命名策略:json tag 按 Go 惯例使用驼峰(firstName),db tag 也沿用同一规则。如果项目要求数据库字段用下划线命名(first_name),目前需要手动修改 db 行的值。工具暂不提供命名风格切换选项,但可以在生成后批量替换:将 `db:"([a-z]+)([A-Z])` 正则匹配后替换为下划线格式,或直接用 IDE 的批量修改功能。
多数同类工具只生成 json 或 yaml 单一 tag,本工具一次输出 json、yaml、db、form、validate 五组 tag,减少重复粘贴操作。另外,本工具纯前端运行,struct 代码不会上传服务器,适合处理包含敏感字段的代码。缺点是只支持标准 struct 语法,不支持嵌套结构体或 interface 类型的自动展开,复杂嵌套需要分层处理。
validate tag 的生成逻辑基于字段类型和 Go 标准零值规则:string 类型默认加 `omitempty`,数字类型加 `min=0`,bool 类型不加校验。工具不分析字段名语义(如不会识别 email 字段自动加 email 校验),也不会读取已有的注释。如果字段类型是 slice、map 或自定义类型,工具会跳过 validate 生成,因为这类字段的校验规则高度依赖业务场景,不适合通用生成。
可以。工具所有代码(包括 Go 语法解析器)都在浏览器端运行,首次加载后即使断网也能正常使用。输入框、生成按钮、结果复制功能全部依赖前端 JavaScript,不需要调用后端接口。如果公司网络屏蔽了外部 CDN,建议在可联网环境下打开一次页面,浏览器会缓存必要的静态资源,之后离线状态也能继续使用。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。