本文主要是介绍Go 语言中的 Struct Tag 的用法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映...
在 Go 语言中,struct 是一种复合数据类型,用于将多个不同类型的数据组合成一个单一的数据单元。通过使用 struct,可以定义复杂的数据结构,便于组织和管理数据。struct 是 Go 语言中非常重要的一个概念,广泛应用于数据建模、对象表示、数据传输等场景。
在 Go 语言中,结构体字段标签(Struct Tag) 是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如 JSON、XML)、ORM 映射、验证等场景。你在开发 Web 应用或处理数据交互时,一定会经常看到类似下面的写法:
type User struct { Username string `json:"username"` Token string `json:"token"` }
其中的 json:"token"
就是字段标签,它并不影响 Go 语言本身的语法逻辑,但它在使用反射(reflect)时非常有用,特别是当你用标准库如 encoding/json 时。
一、结构体标签的基本语法
结构体标签是一对反引号 ` 包起来的字符串,里面是一个键值对的形式:
FieldName FieldType `key:"value"` //可以写多个键值对: FieldName FieldType `json:"token" xml:"token" validate:"required"`
这些标签是给其他包(通常是库)解析使用的,不影响 Go 编译器的行为。
二、json:"token"的具体含义
当你用 encoding/json 包将结构体编码为 JSON 时,这个标签的作用是:
✅ 指定序列化后的字段名
默认情况下,Go 会使用结构体字段名作为 JSON 的字段名。但注意:
Go 结构体的字段是大写开头(导出);
JSON 通常用小写字段名(如 “token”);
为了统一后端返回格式并满足前端规范,我们可以显式指定字段名:
type User struct { Token string `json:"token"` }
生成的json:
{ "token": "abchttp://www.chinasem.cn123" }
✅ 反序列化时也生效
当你将 JSON 反序列化成结构体时,Go 会根据标签来找对应字段。例如上面的json格式能成功映射到:
var user User json.Unmarshal(data, &user) // user.Token == "abc123"
三、常见的标签格式变体
type User struct { Token string `json:"token"` // 显式指定字段名为 token Age int `json:"-"` // 忽略该字段,不进行序列化 Email string `json:"email,omitempty"` // 若为空则忽略该字段 }
json:“-”: 表示这个字段永远不会被编码或解码,即不导出。
json:“email,omitempty”: 表示只有python字段不为默认值时,才会被编码到 JSON(比如字符串为 “”,数字为 0 就会忽略)。
四、使用示例
package main import ( "encoding/json" "fmt" ) type User struct { Username string `json:"username"` Token string `json:"token"` Age int `json:"-"` // 不导出 } func main() { user := User{ Username: "Alice", Token: "abc123", Age: 30, } data, _ := json.Marshal(user) fmt.Println(stringjs(data)) } //{"username":"Alice","token":"abc123"}
五、使用建议
- 字段必须导出(首字母大写),否则即使有 tag,json 包也不会访问它。
- 推荐统一使用小写 JSON 字段名:json:“username”,更符合前端 JSON 风格。
- 如有嵌套结构体,注意为子结构体也添加 json 标签。!!!~~~~~~~~!!! 务必都为添加 json 标签的结构体!!!!不然前端解析不了!!!
疑问? 如果json tag为"-" ,为什么不把结构体首字母小写呢 不是一个效果吗?
✅json:"-"
的用途
json:“-” 是明确告诉 encoding/json:“这个字段你不要处理,序列化python/反序列化时忽略它”。这在结构体对外暴露字段但不希望被 JSON 处理时非常有用,比如:
type User struct { Username string `json:"username"` Password string `json:"-"` // 不想被输出! }
你仍然可以在后端处理 Password 字段,但它不会出现在 JSON 输出中。这是安全和结构清晰性方面的明确表达。
✅ 总结:选择建议
目的 | 用法推荐 |
---|---|
字段仅用于内部逻辑,不想暴露出去 | 小写字段 |
字段对程序可见,但不想在 JSON 中出现 | json:"-" |
需要 JSON 中出现但字段名不同 | json:"your_name" |
希望字段在为空时不出现 | json:"your_name,omitempty" |
简单例子:
type RespMsg struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } type LoginData struct { Token string `json:"token"` Username string `json:"username"` Location string `json:"location"` } rsp := RespMsg{ Code: 200, Msg: "success", Data: LoginData{ Token: userToken, Usernamhttp://www.chinasem.cne: username, Location: "/static/view/home.html", }, }
这样返回的 JSON 就是:
{ "code": 200, "msg": "success", "data": { "token": "...", "username": "...", "location": "..." } }
前端用 resp.data.token、resp.data.username 就不会有大小写错位的问题。
到此这篇关于Go 语言中的 Struct Tag 的用法详解的文章就介绍到这了,更多相关Go Struct Tag 用法内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Go 语言中的 Struct Tag 的用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!