如何在Go中使用结构体标签

2023-12-13 09:05:59

引言

结构体,或结构体,用于将多个信息收集到一个单元中。这些[信息集合]用于描述更高层次的概念,例如由街道城市邮政编码组成的地址。当您从数据库或api等系统读取此信息时,您可以使用结构体标签来控制如何将此信息分配给结构体的字段。结构体标签是附加到结构体字段的小块元数据,为其他使用该结构体的Go代码提供指令。

Struct标签是什么样子的?

Go结构体标签是出现在Go结构体声明中的类型之后的注释。每个标签都由与一些相应值相关联的短字符串组成。

一个struct标签看起来像这样,标签偏移量用反引号`字符:

type User struct {
   
	Name string `example:"name"`
}

然后,其他Go代码能够检查这些结构体并提取分配给它请求的特定键的值。如果没有额外的代码来检查结构体标签,结构体标签对代码的操作是没有影响的。

请尝试这个示例,看看struct标签是什么样子的,如果没有来自其他包的代码,它们将没有效果。

package main

import "fmt"

type User struct {
   
	Name string `example:"name"`
}

func (u *User) String() string {
   
	return fmt.Sprintf("Hi! My name is %s", u.Name)
}

func main() {
   
	u := &User{
   
		Name: "Sammy",
	}

	fmt.Println(u)
}
OutputHi! My name is Sammy

这个例子定义了一个带有Name字段的User类型。Name字段被赋予了一个结构体标签example:" Name "。在对话中,我们将这个特定的标签称为“示例结构体标签”,因为它使用单词“example”作为其键。example结构体标签的name字段值为"name"。在User类型上,我们还定义了fmt.Stringer接口所需的String()方法。当我们将类型传递给fmt.Println时,这将自动调用,并让我们有机会生成我们的结构体的格式良好的版本。

main函数体中,我们创建了一个User类型的新实例,并将其传递给fmt.Println。即使该结构体有一个struct标签,我们也看到它对此Go代码的操作没有影响。如果struct标签不存在,它的行为将完全相同。

要使用结构体标签完成某些工作,必须编写其他Go代码以在运行时检查结构体。标准库中有一些包使用struct标签作为操作的一部分。其中最流行的是encoding/json包。

JSON编码

JavaScript对象表示法(JavaScript Object Notation, JSON)是一种文本格式,用于编码以不同字符串键组织的数据集合。它通常用于不同程序之间的数据通信,因为格式足够简单,有很多库可以在许多不同的语言中解码数据。下面是JSON的一个例子:

{
   
  "language": "Go",
  "mascot": "Gopher"
}

Try this example to see how JSON is encoded without struct tags:
这个JSON对象包含两个键,languagemascot。这些键后面是相关的值。这里,language键的值为Go,而mascot的值为Gopher

标准库中的JSON编码器使用struct标签作为注释,向编码器表明您希望如何命名JSON输出中的字段。这些JSON编码和解码机制可以在encoding/json中找到。

尝试下面的例子,看看没有struct标签JSON是如何编码的:

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"os"
	"time"
)

type User struct {
   
	

文章来源:https://blog.csdn.net/QIU176161650/article/details/134921584
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。