Go 語言中的 Struct Tag 的用法詳解

在 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": "abc123"
}

? 反序列化時也生效
當你將 JSON 反序列化成結構體時,Go 會根據標簽來找對應字段。例如上面的json格式能成功映射到:

var user User
json.Unmarshal(data, &user)
// user.Token == "abc123"

三、常見的標簽格式變體

type User struct {Token string `json:"token"`           // 顯式指定字段名為 tokenAge   int    `json:"-"`               // 忽略該字段,不進行序列化Email string `json:"email,omitempty"` // 若為空則忽略該字段
}

json:“-”: 表示這個字段永遠不會被編碼或解碼,即不導出。
json:“email,omitempty”: 表示只有字段不為默認值時,才會被編碼到 JSON(比如字符串為 “”,數字為 0 就會忽略)。

四、使用示例

package mainimport ("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(string(data))
}
//{"username":"Alice","token":"abc123"}

五、使用建議

  1. 字段必須導出(首字母大寫),否則即使有 tag,json 包也不會訪問它。
  2. 推薦統一使用小寫 JSON 字段名:json:“username”,更符合前端 JSON 風格。
  3. 如有嵌套結構體,注意為子結構體也添加 json 標簽。!!!~~~~~~~~!!! 務必都為添加 json 標簽的結構體!!!!不然前端解析不了!!!

疑問? 如果json tag為"-" ,為什么不把結構體首字母小寫呢 不是一個效果嗎?

?json:"-"的用途
json:“-” 是明確告訴 encoding/json:“這個字段你不要處理,序列化/反序列化時忽略它”。這在結構體對外暴露字段但不希望被 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,Username: username,Location: "/static/view/home.html",},
}

這樣返回的 JSON 就是:

{"code": 200,"msg": "success","data": {"token": "...","username": "...","location": "..."}
}

前端用 resp.data.token、resp.data.username 就不會有大小寫錯位的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84343.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟正式發布 SQL Server 2025 公開預覽版,深度集成AI功能

微軟在今年的 Build 2025 大會上正式發布了 SQL Server 2025 公開預覽版,標志著這一經典數據庫產品在 AI 集成、安全性、性能及開發者工具方面的全面升級。 AI 深度集成與創新 原生向量搜索:SQL Server 2025 首次將 AI 功能直接嵌入數據庫引擎&#xff…

React從基礎入門到高級實戰:React 基礎入門 - React 的工作原理:虛擬 DOM 與 Diff 算法

React 的工作原理:虛擬 DOM 與 Diff 算法 引言 React 是現代前端開發的明星框架,它的出現徹底改變了我們構建用戶界面的方式。無論是動態的 Web 應用還是復雜的單頁應用(SPA),React 都能以高效的渲染機制和簡潔的組件…

解釋一下NGINX的反向代理和正向代理的區別?

大家好,我是鋒哥。今天分享關于【解釋一下NGINX的反向代理和正向代理的區別?】面試題。希望對大家有幫助; 解釋一下NGINX的反向代理和正向代理的區別? NGINX的反向代理和正向代理的區別主要體現在它們的功能和使用場景上。下面我會詳細解釋它們的定義…

Python學習——執行python時,鍵盤按下ctrl+c,退出程序

在 Python 中,當用戶按下 CtrlC 時,程序默認會觸發 KeyboardInterrupt 異常并終止。 1. 捕獲 KeyboardInterrupt 異常(推薦) 使用 try-except 塊直接捕獲 KeyboardInterrupt 異常,適用于簡單場景。 示例代碼&#xff…

C++ 反向迭代器(Reverse Iterator)實現詳解

目錄 1. 反向迭代器概述 2. 代碼實現分析 3. 關鍵點解析 3.1 模板參數設計 3.2 核心操作實現 4. 使用示例 1. 反向迭代器概述 反向迭代器是STL中一種重要的適配器,它允許我們以相反的順序遍歷容器。本文將詳細講解如何實現一個自定義的反向迭代器模板類。 2.…

動態DNS管理:【etcd+CoreDNS】 vs【BIND9】便捷性對比

對比 BIND9 集群和 etcdCoreDNS 集群在便捷性方面,通常情況下,對于需要動態、頻繁變更 DNS 記錄以及追求云原生和自動化集成的場景,etcdCoreDNS 方案更加便捷。 然而,“便捷性”也取決于具體的應用場景、團隊的技術棧和運維習慣。…

基于大模型的短暫性腦缺血發作預測與干預全流程系統技術方案大綱

目錄 一、系統概述二、系統架構(一)數據采集層(二)大模型核心層(三)應用服務層(四)數據存儲與管理層三、全流程技術方案(一)術前階段(二)術中階段(三)術后階段(四)并發癥風險預測(五)手術方案制定(六)麻醉方案制定(七)術后護理(八)統計分析(九)技術驗…

MSP430通用電機控制代碼(Motor)設計與實現

一、代碼結構概覽 // Motor.h // Motor.h #ifndef __MOTOR_H_ #define __MOTOR_H_#include "A_include.h"void Motor_Init(void); // 初始化函數 void PWM_SET(int duty0, int duty1); // PWM設置函數#endif// Motor.c // Motor.c #include "Motor.h"…

25年軟考架構師真題(回憶更新中)

論文題: 系統負載均衡設計方法事件驅動架構多模型數據庫應用軟件測試架構案例分析: 必選題:1.1填寫質量屬性的質量屬性名 1.2解釋器風格架構的組成圖填空,以及解釋為什么該模型適用解釋器風格 選做題1redis2.1全量復制的流程圖 <

優化用戶體驗:攔截瀏覽器前進后退、刷新、關閉、路由跳轉等用戶行為并彈窗提示

&#x1f9d1;?&#x1f4bb; 寫在開頭 點贊 收藏 學會&#x1f923;&#x1f923;&#x1f923; 需求 首先列舉一下需要攔截的行為&#xff0c;接下來我們逐個實現。 瀏覽器前進后退標簽頁刷新和關閉路由跳轉 1、攔截瀏覽器前進后退 這里的實現是核心&#xff0c;涉及到大…

Docker:容器化技術

引言 傳統部署環境逐漸不適應現在的企業開發&#xff0c;為了追求更加輕量&#xff0c;更加容易管理項目&#xff0c;引入了docker容器化技術去實現更加高效的部署環境。 一.docker風光下的內核功能和常用命令 1.docker容器和虛擬機的區別 我們在底層和應用層之間引入了一層do…

ping命令常用參數以及traceout命令

在網絡故障排查和性能分析中&#xff0c;ping和 traceroute&#xff08;Windows中通常稱為 tracert&#xff09;是兩個極為重要的工具。它們幫助診斷網絡連接問題&#xff0c;了解數據在網絡中的傳輸路徑。下面將詳細介紹這兩個命令的常用參數及其應用。 ping命令 ping命令用…

SpringBoot開發——Spring Boot異常處理全攻略:五大方案實戰對比

文章目錄 一、血淚教訓:異常處理的代價二、五大異常處理方案詳解2.1 全局異常處理(推薦方案)2.2 控制器級處理2.3 HTTP狀態碼注解2.4 ResponseEntity精細控制2.5 自定義異常體系(企業級方案)三、五大方案對比決策表四、四大避坑指南4.1 異常吞噬陷阱4.2 循環依賴問題4.3 異…

CodeBuddy 實現圖片轉素描手繪工具

本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 最近在社交媒體上&#xff0c;各種素描風格的圖片火得一塌糊涂&#xff0c;身邊不少朋友都在分享自己的 “素描照”&#xff0c;看著那些黑白線條勾勒出的獨特韻味&a…

2025.05.21華為暑期實習機考真題解析第二題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 02. 災區物資調度路徑規劃 問題描述 在一次嚴重的自然災害后,LYA負責協調救援物資的配送工作。救援區域包含多個受災鄉鎮和一個物資集結點,各個地點之間的道路狀況各異,有些甚至…

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》學習心得

一、引言 在當今數字化營銷浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑著市場格局。GenAI 既是一場充滿機遇的變革,也是一場潛在風險的挑戰。一方面,絕大多數 B2C 營銷領導者對 GenAI 賦能營銷抱有極高期待,他們看到了 GenAI 在提升時間與成本效率方面的巨大潛…

探索鏈表的奇妙世界:從基礎到高級應用

鏈表是計算機科學中一種基礎且重要的數據結構&#xff0c;它如同一條由珠子串成的項鏈&#xff0c;每個珠子&#xff08;節點&#xff09;都包含著數據和指向下一個珠子的線索。 與數組相比&#xff0c;鏈表在插入和刪除操作上更加靈活&#xff0c;無需預先分配固定大小的內存…

黑馬點評雙攔截器和Threadlocal實現原理

文章目錄 雙攔截器ThreadLocal實現原理 雙攔截器 實現登錄狀態刷新的原因&#xff1a; ? 防止用戶會話過期&#xff1a;通過動態刷新Token有效期&#xff0c;確保活躍用戶不會因固定過期時間而被強制登出 ? 提升用戶體驗&#xff1a;用戶無需頻繁重新登錄&#xff0c;只要…

Windows 中動態庫.dll 的 .lib 文件有什么作用?

在 Windows 平臺開發中, 動態鏈接庫(Dynamic Link Library, DLL)。與之相關的還有一個常讓人困惑的文件——.lib 文件。那么,這個 .lib 文件到底有什么作用呢? 一、什么是 .lib 文件? .lib 文件是 靜態導入庫(Import Library) 文件,它通常與動態鏈接庫(DLL)一起生成…

細說STM32單片機FreeRTOS消息緩沖區及其應用實例

目錄 一、消息緩沖區功能概述 二、消息緩沖區操作相關函數 1、相關函數概述 2、部分函數詳解 &#xff08;1&#xff09;創建消息緩沖區 &#xff08;2&#xff09;寫入消息 &#xff08;3&#xff09;讀取消息 &#xff08;4&#xff09;消息緩沖區狀態查詢 三、消息…