开发者工具 · Go 全栈

Go struct tag 生成

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

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

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关闭