当前位置: 首页 > article >正文

Go 语言常用的结构体标签解析

在 Go 语言中,结构体标签(Struct Tags) 是用于在结构体字段上附加元数据的字符串,通常用于 JSON 序列化、数据库 ORM 绑定、表单验证等 场景。结构体标签的本质是 反射(Reflection),可以通过 reflect 包进行解析。


1. 结构体标签的基本语法

结构体标签通常以 反引号(`) 包围,格式如下:

type StructName struct {
    FieldName FieldType `tag_key:"tag_value"`
}

多个标签可以在同一行中使用 空格 分隔:

type User struct {
    ID   int    `json:"id" xml:"id"`
    Name string `json:"name" xml:"name" validate:"required"`
}

2. Go 语言常见的结构体标签

标签作用示例
jsonJSON 编解码json:"user_id"
xmlXML 解析xml:"user_id"
gormORM 数据库映射gorm:"column:user_id;primaryKey"
validate数据校验validate:"required,email"
formWeb 表单绑定form:"username"
bindingGin 参数校验binding:"required"
yamlYAML 解析yaml:"config_name"

3. json 结构体标签(JSON 编解码)

json 标签用于 Go 结构体与 JSON 之间的转换,通常用于 API 数据交互

(1)基本用法

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	user := User{ID: 1, Name: "Alice", Age: 25}

	// 结构体转 JSON
	jsonData, _ := json.Marshal(user)
	fmt.Println(string(jsonData)) // {"id":1,"name":"Alice","age":25}

	// JSON 转结构体
	jsonStr := `{"id":2,"name":"Bob","age":30}`
	var newUser User
	json.Unmarshal([]byte(jsonStr), &newUser)
	fmt.Println(newUser) // {2 Bob 30}
}

2)忽略字段

  • json:"-":表示 序列化和反序列化时忽略该字段
  • json:",omitempty":如果字段值是 零值0, "" , nil),则 不包含在 JSON 结果中
type User struct {
	Password string `json:"-"`            // 忽略此字段
	Email    string `json:"email,omitempty"` // 若为空,则不序列化
}

4. gorm 结构体标签(数据库 ORM 映射)

gorm 标签用于 数据库表字段映射,通常在 GORM ORM 框架中使用。

(1)基本用法

type User struct {
	ID        uint   `gorm:"primaryKey"`
	Name      string `gorm:"column:user_name;type:varchar(100);not null"`
	Age       int    `gorm:"default:18"`
	CreatedAt int64  `gorm:"autoCreateTime"`
}

(2)常见 gorm 标签

标签作用
primaryKey设为主键
column:name指定数据库字段名
type:varchar(100)指定字段类型
not null不能为空
default:18设置默认值
autoCreateTime自动填充创建时间

5. validate 结构体标签(数据校验)

validate 标签用于 请求参数校验,主要配合 github.com/go-playground/validator/v10 库使用。

(1)安装依赖

go get github.com/go-playground/validator/v10

(2)示例

package main

import (
	"fmt"
	"github.com/go-playground/validator/v10"
)

type User struct {
	Name  string `validate:"required"`       // 必填
	Email string `validate:"required,email"` // 必填且格式为 Email
	Age   int    `validate:"gte=18,lte=60"`  // 年龄必须在 18-60 之间
}

func main() {
	validate := validator.New()
	user := User{Name: "Alice", Email: "alice@example.com", Age: 20}
	err := validate.Struct(user)
	if err != nil {
		fmt.Println("校验失败:", err)
	} else {
		fmt.Println("校验通过!")
	}
}

3)常见 validate 规则

规则作用
required必填
email必须是邮箱格式
gte=18必须 >=18
lte=60必须 <=60
oneof=admin user guest只能是 admin/user/guest

6. binding 结构体标签(Gin 参数校验)

Gin 框架中,binding 标签用于 自动校验请求参数

示例

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type RegisterRequest struct {
	Username string `json:"username" binding:"required,min=3,max=20"`
	Email    string `json:"email" binding:"required,email"`
}

func RegisterHandler(c *gin.Context) {
	var req RegisterRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	c.JSON(http.StatusOK, gin.H{"message": "注册成功"})
}

func main() {
	r := gin.Default()
	r.POST("/register", RegisterHandler)
	r.Run(":8080")
}

7. form 结构体标签(表单解析)

form 标签用于解析 HTML 表单提交的数据

示例

type LoginForm struct {
	Username string `form:"username"`
	Password string `form:"password"`
}

在 Gin 处理 POST 表单:

func LoginHandler(c *gin.Context) {
	var form LoginForm
	if err := c.ShouldBind(&form); err != nil {
		c.JSON(400, gin.H{"error": err.Error()})
		return
	}
	c.JSON(200, gin.H{"message": "登录成功"})
}

8. yaml 结构体标签(YAML 配置解析)

yaml 标签用于 解析 YAML 配置文件,一般用于 读取应用配置

示例

package main

import (
	"fmt"
	"gopkg.in/yaml.v3"
)

type Config struct {
	ServerPort int    `yaml:"server_port"`
	DbHost     string `yaml:"db_host"`
}

func main() {
	yamlData := `
server_port: 8080
db_host: "localhost"
`
	var config Config
	yaml.Unmarshal([]byte(yamlData), &config)
	fmt.Println(config) // {8080 localhost}
}

总结

标签用途
jsonJSON 解析
xmlXML 解析
gormORM 数据库映射
validate数据校验
bindingGin 参数校验
form表单解析
yamlYAML 配置解析

📌 结构体标签广泛用于数据序列化、数据库操作、参数校验等场景,是 Go 语言开发中的重要组成部分! 🚀


http://www.kler.cn/a/545506.html

相关文章:

  • 基于 GEE 计算研究区年均地表温度数据
  • Unity状态机的实现方法一
  • 【Elasticsearch】字符过滤器Character Filters
  • 深度学习|表示学习|归一化和正则化带给我们的启示|27
  • 前端开发:打造磨砂质感的盒子效果
  • python自动化测试之统一请求封装及通过文件实现接口关联
  • 使用 Flask 构建流式返回服务
  • Logistic Regression 逻辑回归中的sigmoid函数是什么?
  • 【Linux】多线程 -> 从线程概念到线程控制
  • 【CXX】0 Rust与C ++的互操作利器:CXX库介绍与示例
  • 深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组
  • RV1126解码(1)
  • 多能互补综合能源系统,改变能源结构---安科瑞 吴雅芳
  • 探索ChatGPT背后的前端黑科技
  • 【每日关注】科技圈重要动态
  • JVM——垃圾回收器
  • Redis企业开发实战(五)——点评项目之分布式锁Redission与秒杀优化
  • 基于Spring Boot的网上宠物店系统设计与实现(LW+源码+讲解)
  • 【数据结构课设--内部排序算法的性能分析系统】
  • 考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)