You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Go Ent生成代码时不添加json:"omitempty"结构体标签

解决Go Ent自动给字段添加omitempty标签的批量处理方案

方法一:自定义工具函数简化字段设置

创建通用函数统一处理字段的JSON标签,避免重复编写StructTag逻辑:

// ent/schema/utils.go
package schema

import "entgo.io/ent/schema/field"

// NoOmitEmpty 给字段设置不带omitempty的JSON标签
func NoOmitEmpty(f field.Field) field.Field {
	return f.StructTag(`json:"` + f.Name() + `"`)
}

在Schema的字段定义中调用该函数即可:

// ent/schema/user.go
func (User) Fields() []ent.Field {
	return []ent.Field{
		field.String("name").Apply(NoOmitEmpty),
		field.Int("money").Apply(NoOmitEmpty),
	}
}

方法二:代码生成扩展批量移除omitempty

通过自定义Ent代码生成扩展,在代码生成阶段自动移除所有字段JSON标签中的omitempty,无需逐个修改Schema:

  1. 新建ent/entc.go文件:
package ent

import (
	"entgo.io/ent/entc"
	"entgo.io/ent/entc/gen"
	"strings"
)

type noOmitEmptyExtension struct{}

func (noOmitEmptyExtension) Hooks() []gen.Hook {
	return []gen.Hook{
		func(next gen.Generator) gen.Generator {
			return gen.GenerateFunc(func(g *gen.Graph) error {
				for _, node := range g.Nodes {
					for _, field := range node.Fields {
						// 可选:保留ID字段的默认omitempty标签,跳过处理
						if field.Name == "id" {
							continue
						}
						if field.StructTag == "" {
							continue
						}
						// 移除标签中的omitempty关键字
						newTag := strings.ReplaceAll(field.StructTag, ",omitempty", "")
						newTag = strings.TrimSuffix(newTag, "omitempty")
						field.StructTag = newTag
					}
				}
				return next.Generate(g)
			})
		},
	}
}

func Generate() {
	entc.Generate("./schema", &gen.Config{}, entc.Extensions(&noOmitEmptyExtension{}))
}
  1. 修改ent/generate.go的生成指令:
package ent

//go:generate go run entc.go
  1. 执行生成命令:
go generate ./ent

生成后的结构体字段JSON标签会自动移除omitempty,比如Money字段的标签变为json:"money",0值能正常出现在HTTP响应体中。

注意事项

  • 若需保留特定字段的omitempty,可在方法二的钩子中添加字段名判断,跳过对应字段的处理。
  • 该方案要求Ent版本在v0.10及以上(代码扩展功能从该版本开始支持)。

内容的提问来源于stack exchange,提问作者Ellisein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:27:39