golang結(jié)構(gòu)體tag的使用小結(jié)
?? 一、什么是結(jié)構(gòu)體 Tag?
在 Go 中,結(jié)構(gòu)體字段可以有額外的元信息,稱為 Tag(標(biāo)簽)。這些信息通常用于:
- 序列化(如
json,xml,yaml) - 表單綁定(如
form) - 校驗(如
validate) - 數(shù)據(jù)庫映射(如
gorm,xorm)
Tag 寫在結(jié)構(gòu)體字段名的后面,用 反引號 ``` 包裹。
?? 二、結(jié)構(gòu)體 Tag 的基本語法
type StructName struct {
FieldName FieldType `tagKey:"tagValue"`
}?? 多個 tag 用 空格隔開,例如:
FieldName string `json:"name" xml:"name" validate:"required"`
?? 三、圖示講解結(jié)構(gòu)體 tag 組成
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
Age int `json:"-"` // 不序列化
}| 字段名 | 類型 | Tag 字符串 | 含義 |
|---|---|---|---|
| ID | int | json:"id" | JSON 輸出為 id |
| Name | string | json:"name" | JSON 輸出為 name |
| string | json:"email,omitempty" | 如果為零值則不輸出 | |
| Age | int | json:"-" | 永遠忽略,不輸出 |
?? 四、實戰(zhàn)場景演示
? 示例1:JSON 序列化
package main
?
import (
"encoding/json"
"fmt"
)
?
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
Age int `json:"-"`
}
?
func main() {
user := User{ID: 1001, Name: "李雷", Email: "", Age: 30}
result, _ := json.Marshal(user)
fmt.Println(string(result)) // 輸出:{"id":1001,"name":"李雷"}
}?? 為什么只有 ID 和 Name?
- Email 為空,使用了 omitempty
- Age 被忽略,使用了 "-"
? 示例2:GORM 中的數(shù)據(jù)庫映射 tag
type Product struct {
ID int `gorm:"primaryKey;autoIncrement" json:"id"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
Price int `gorm:"column:product_price" json:"price"`
}| tag 類型 | 示例內(nèi)容 | 說明 |
|---|---|---|
| gorm | primaryKey, type, column | 表示數(shù)據(jù)庫字段特性 |
| json | json:"name" | 表示 JSON 序列化字段名 |
? 示例3:表單解析 + 校驗 tag
type LoginForm struct {
Username string `form:"username" json:"username" binding:"required"`
Password string `form:"password" json:"password" binding:"required,min=6"`
}| tag | 用法 |
|---|---|
| form | 表單字段綁定,例如 HTTP POST 請求 |
| json | JSON 請求體解析 |
| binding | 驗證字段,如 required, min=6 等 |
?? 五、如何讀取 Tag?
通過反射(reflect)讀取結(jié)構(gòu)體字段的 tag。
import (
"fmt"
"reflect"
)
?
type Person struct {
Name string `json:"name" label:"姓名"`
}
?
func main() {
t := reflect.TypeOf(Person{})
field := t.Field(0)
?
fmt.Println("json tag:", field.Tag.Get("json")) // 輸出 name
fmt.Println("label tag:", field.Tag.Get("label"))// 輸出 姓名
}?? 六、tag 使用建議
| 建議 | 原因 |
|---|---|
| ?避免亂寫 | tag 格式要正確,例如反引號必須成對 |
| ? 多 tag 用空格分隔 | 保持清晰易讀 |
| ?? 可以結(jié)合反射動態(tài)讀取 tag | 做校驗、自動映射等功能 |
| ?? 不要暴露敏感字段到 JSON 中 | 使用 json:"-" |
?? 七、可視化圖(結(jié)構(gòu)體 tag 工作流程)
+-------------------+ | struct 定義 | |-------------------| | Name string | | `json:"name"`| -----> 序列化 JSON 輸出字段 "name" +-------------------+
到此這篇關(guān)于golang結(jié)構(gòu)體tag的使用小結(jié)的文章就介紹到這了,更多相關(guān)golang結(jié)構(gòu)體tag內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文搞懂Golang文件操作增刪改查功能(基礎(chǔ)篇)
這篇文章主要介紹了一文搞懂Golang文件操作增刪改查功能(基礎(chǔ)篇),Golang 可以認為是服務(wù)器開發(fā)語言發(fā)展的趨勢之一,特別是在流媒體服務(wù)器開發(fā)中,已經(jīng)占有一席之地,今天我們不聊特別深奧的機制和內(nèi)容,就來聊一聊 Golang 對于文件的基本操作2021-04-04
Golang中crypto/ecdsa庫實現(xiàn)數(shù)字簽名和驗證
本文主要介紹了Golang中crypto/ecdsa庫實現(xiàn)數(shù)字簽名和驗證,將從ECDSA的基本原理出發(fā),詳細解析如何在Go語言中實現(xiàn)數(shù)字簽名和驗證,具有一定的參考價值,感興趣的可以了解一下2024-02-02
Go prometheus metrics條目自動回收與清理方法
這篇文章主要為大家介紹了Go prometheus metrics條目自動回收與清理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11

