Go 语言中的 Struct Tag 的用法详解

2025-05-24 03:50
文章标签 语言 go 详解 用法 struct tag

本文主要是介绍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 的用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154763

相关文章

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具