如何在Go中使用结构体标签
引言
结构体,或结构体,用于将多个信息收集到一个单元中。这些[信息集合]用于描述更高层次的概念,例如由街道
、城市
、州
和邮政编码
组成的地址
。当您从数据库或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对象包含两个键,language
和mascot
。这些键后面是相关的值。这里,language
键的值为Go
,而mascot
的值为Gopher
。
标准库中的JSON编码器使用struct标签作为注释,向编码器表明您希望如何命名JSON输出中的字段。这些JSON编码和解码机制可以在encoding/json
包中找到。
尝试下面的例子,看看没有struct标签JSON是如何编码的:
package main
import (
"encoding/json"
"fmt"
"log"
"os"
"time"
)
type User struct {
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!