PHP转Go之玩转Golang结构体的tag

结构体的tag是Golang区别于PHP独有的概念,本文会详细介绍Go中tag的定义、用法及常用场景

本文概要

  • 结构体 tag 的定义
  • 结构体 tag 的读取
  • 结构体 tag 的常用场景

结构体 tag 的定义

在Go语言中,结构体标签是通过在结构体定义的字段后面添加一个字符串来定义的。这个字符串被称为标签(tag),其中包含了一些键-值对,以键:值的形式表示。例如:

Golang 复制代码
type Person struct { 
    Name string `json:"name" xml:"name" csv:"name"` 
    Age int `json:"age" xml:"age" csv:"age"` 
    Address string `json:"address" xml:"address" csv:"address"` 
}

如何读取结构体 tag

tag的读取利用的是golagn的反射机制

Golang 复制代码
package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string `json:"name" xml:"person_name"`
	Age  int    `json:"age" xml:"person_age"`
}

func main() {
	p := Person{Name: "John Doe", Age: 30}

	// 获取结构体的反射类型
	t := reflect.TypeOf(p)

	// 遍历结构体的字段
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i)
		tag := field.Tag.Get("json") // 获取json标签
		fmt.Printf("Field: %s, Tag: %s\n", field.Name, tag)
	}
}
// Output:
Field: Name, Tag: name
Field: Age, Tag: age

结构体 tag 的常用场景

  1. 序列化和反序列化

比如上面的tag中包含的json tag,当使用json.Marshal时,会读取对应字段定义的json tag,然后将json对象中的key赋值为该值。

需要特别注意,对于以小写开头的字段,序列化及反序列化时是忽略的;另外对于即使没定义json tag的字段序列化时通常也会默认以字段名赋值到json的键名上

  1. 验证和过滤

这个是非常常见的需求,比如前端传过来的参数都需要校验下;这个验证比较常用的库就是 go-playground/validator,只需要在结构体tag上完成验证规则标记,即可快速书进行验证

Golang 复制代码
type User struct {  
    Name     string `validate:"required"`  
    Age      int    `validate:"min=1,max=120"`  
    Email    string `validate:"required,email"`  
    Password string `validate:"required,min=6"`  
} 
  1. 数据库列映射

常用的数据库,比如gorm or xorm均是利用tag完成数据字段的对应

Golang 复制代码
// Gorm
type User struct {  
    Name  string `gorm:"column:username"`  
    Age   int    `gorm:"column:age"`  
    Email string `gorm:"column:email"`  
} 
// Xorm
type User struct {  
    Name     string `xorm:"'username'"`  
    Age      int    `xorm:"'age'"`  
    Email    string `xorm:"'email'"`  
}  

tag 的用处自然不止这么点,利用tag可以完成更多的程序的自动化,比如标记某个字段是否记录日志等等,tag也可以完全自定义用途

相关推荐
azhou的代码园2 分钟前
基于SpringBoot+微信小程序的图片识别科普系统
spring boot·后端·微信小程序
Tony Bai30 分钟前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
用户31673613034238 分钟前
javaLangchain4j从官方文档入手,看他做了什么——具体使用(二)
后端
無名路人39 分钟前
Zsh 脚本 + VS Code 任务:NestJS + Vue3 一键部署到 1Panel
运维·后端·自动化运维
ybwycx1 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch
程途知微2 小时前
AQS 同步器——Java 并发框架的核心底座全解析
java·后端
iPadiPhone2 小时前
分布式架构的“润滑剂”:RabbitMQ 核心原理与大厂面试避坑指南
分布式·后端·面试·架构·rabbitmq
武子康3 小时前
大数据-255 离线数仓 - Apache Atlas 数据血缘与元数据管理实战指南
大数据·后端·apache hive
javaTodo3 小时前
IntelliJ IDEA 2026.1 上强度了:Spring 运行时 Debug + AI 全面接入,太香了
后端
晴栀ay3 小时前
Generator + RxJS 重构 LLM 流式输出的“丝滑”架构
javascript·后端·llm