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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;消息缓冲区状态查询 三、消息…