开发者工具 · Go 全栈

Go struct tag 生成

一键生成 json/yaml/db/form/validate tag

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 61 次使用

Go struct tag 速查

json/yaml/db/form/validate tag · 点击复制

第一节

关于本工具

About

在 Go 结构体里手写 json、yaml 或 db 标签,改一个字段名就得同步改四五处,漏一处就序列化失败。这个工具把结构体定义贴进去,一次生成 json、yaml、db、form、validate 五种标签,字段名、类型、嵌套层级自动对应,validate 标签按常见校验规则预填。所有解析和拼接都在浏览器本地完成,结构体定义不会离开设备。

使用场景

API 联调字段对齐

后端定义了一个 18 个字段的 UserProfile 结构体,前端要求 json 字段为驼峰,DBA 要求 db 字段为下划线,验证层需要 validate 标签。手动写 18 组标签,漏一个就联调失败。把结构体粘贴进本工具,勾选 json、db、validate,一次生成全部标签,字段名、类型、长度全部对齐,联调零返工。

微服务接口文档生成

团队用 proto 定义服务,但部分遗留接口仍用 Go struct 手写。每次接口变更,要把新增字段的 json 标签、form 标签、校验规则逐一补到文档示例里,漏一个字段前端就报 400。把变更后的 struct 贴进来,勾选 json+form+validate,直接复制标签粘贴到代码,文档示例跟着更新,不遗漏。

ORM 模型批量迁移

旧项目用 gorm,新项目切到 sqlx,所有 Model 的 db 标签要从 gorm 的 column 格式改成 sqlx 的 db 格式。200 个字段手动改,漏一个就查半天。把整个 Model struct 粘贴,选 db 标签生成,直接覆盖原标签行,字段名、类型完全一致,迁移后首次查询全部通过。

表单校验规则统一

注册页有 12 个输入框,邮箱、手机号、密码强度、年龄范围各需不同 validate 标签。手写时容易把 max=120 写成 1200,或者漏掉 required。把结构体字段和类型粘贴进本工具,勾选 validate,输出标签直接复制到代码,校验规则与字段类型自动匹配,上线后零校验漏洞。

多环境配置结构体同步

开发、测试、生产三个环境的配置结构体字段完全一致,但 yaml 标签的命名规范不同(dev 用驼峰,prod 用下划线)。每次新增配置项,要手动写三套 yaml 标签,写错一个环境就加载失败。把结构体粘贴,分别选 yaml 标签生成,三套标签一次搞定,字段名与环境规范严格对应。

第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧代码编辑区粘贴或键入 Go 结构体定义,如 `type User struct { Name string }`,右侧预览区同步显示原始结构
  2. 2勾选需要生成的 tag 类型:json、yaml、db、form、validate 可多选,每勾一项右侧结果区即时追加对应 tag 行
  3. 3点击「生成 Tag」按钮,结果区输出带 tag 的完整结构体代码,每行 tag 按勾选顺序排列
  4. 4点结果区右上角「复制」图标,整段代码写入剪贴板,可直接粘贴到编辑器

输入输出示例

输入输出说明
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 关键字,否则只校验外层结构体,内部字段的验证规则被忽略。

第三节

工作原理

How It Works

核心公式

tag = `key:"value"`

变量说明

  • keytag 类型,如 json、yaml、db
  • value字段名或约束,如 field_name、required

示例

Go 结构体字段 UserName,选择 json 和 validate 两种 tag:json 的 value 为 user_name(蛇形命名),validate 的 value 为 required,min=3,max=50。生成结果:`json:"user_name" validate:"required,min=3,max=50"`。

Go struct tag 生成 · 纯浏览器端流程输入 struct 源码字段名 + 类型解析字段提取名称 / 类型匹配 tag 模板json / yaml / dbform / validate输出完整 struct带 tag 的代码
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
这个工具生成的 tag 是直接就能用吗,还是得自己改?

生成的 tag 格式符合标准 Go 库惯例,json 对应 encoding/json,yaml 对应 gopkg.in/yaml.v3,validate 对应 go-playground/validator。直接复制到 struct 字段上方即可,无需手动修改。但注意 validate tag 的规则(如 required、min、max)需要根据业务逻辑确认是否适用,工具只生成结构骨架,不判断字段的业务校验逻辑。

我 struct 字段已经有 json tag 了,再点生成会不会覆盖掉?

本工具完全在浏览器本地运行,不会读取或修改用户已有的代码文件。操作流程是:用户在输入框粘贴 struct 代码 → 点击生成 → 工具解析字段名和类型 → 输出带 tag 的完整 struct 文本。用户需要手动复制结果覆盖原代码。如果只想生成缺失的 tag,可以只复制新增字段的 struct 片段,工具不会自动合并已有内容。

为什么我贴了 struct 进去,点生成没反应?

最常见原因是输入的代码不符合 Go 语法规范,例如缺少字段类型、花括号不匹配、或混入了非 Go 语言的注释符号。本工具依赖前端解析器按标准 Go 语法解析,遇到非法输入会静默失败。建议检查:每个字段行是否包含字段名 + 类型(如 Name string),是否误用了单引号或中文冒号。如果代码较长,可以先截取一个最小的 struct 测试。

生成的 tag 里 json 和 db 的字段名为什么是驼峰不是下划线?

这是工具默认的命名策略:json tag 按 Go 惯例使用驼峰(firstName),db tag 也沿用同一规则。如果项目要求数据库字段用下划线命名(first_name),目前需要手动修改 db 行的值。工具暂不提供命名风格切换选项,但可以在生成后批量替换:将 `db:"([a-z]+)([A-Z])` 正则匹配后替换为下划线格式,或直接用 IDE 的批量修改功能。

这个工具跟在线生成 json tag 的网站有什么区别?

多数同类工具只生成 json 或 yaml 单一 tag,本工具一次输出 json、yaml、db、form、validate 五组 tag,减少重复粘贴操作。另外,本工具纯前端运行,struct 代码不会上传服务器,适合处理包含敏感字段的代码。缺点是只支持标准 struct 语法,不支持嵌套结构体或 interface 类型的自动展开,复杂嵌套需要分层处理。

validate tag 里的规则是怎么来的,为什么有的字段没生成?

validate tag 的生成逻辑基于字段类型和 Go 标准零值规则:string 类型默认加 `omitempty`,数字类型加 `min=0`,bool 类型不加校验。工具不分析字段名语义(如不会识别 email 字段自动加 email 校验),也不会读取已有的注释。如果字段类型是 slice、map 或自定义类型,工具会跳过 validate 生成,因为这类字段的校验规则高度依赖业务场景,不适合通用生成。

我电脑没网或公司内网限制,这个工具还能用吗?

可以。工具所有代码(包括 Go 语法解析器)都在浏览器端运行,首次加载后即使断网也能正常使用。输入框、生成按钮、结果复制功能全部依赖前端 JavaScript,不需要调用后端接口。如果公司网络屏蔽了外部 CDN,建议在可联网环境下打开一次页面,浏览器会缓存必要的静态资源,之后离线状态也能继续使用。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭