Skip to content

Go 语言中的 Struct 标签的使用

Posted on:2024年6月10日 at 19:18

在Go语言规范中,提到了struct标签的简短概述:

字段声明后面可以跟一个可选的字符串文字标签,该标签成为相应字段声明中所有字段的属性。通过反射接口可以看到这些标签,但其他方面将忽略它们。

例如:

// 一个对应于TimeStamp协议缓冲区的struct。
// 标签字符串定义协议缓冲区字段号。
struct {
  microsec  uint64 "field 1"
  serverIP6 uint64 "field 2"
  process   string "field 3"
}

虽然这是一个非常简短的解释,但struct标签在Go语言中具有重要的用途。

1. 数据格式转换

struct标签常用于定义字段在进行编码或解码时的转换信息。例如,encoding/json包使用struct标签来控制字段如何在JSON和结构体之间进行映射。

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

在这个例子中,json:"name"标签告诉JSON编码器将Name字段映射到JSON对象中的name字段。

2. 数据库映射

ORM(对象关系映射)包,例如gorm,使用struct标签来定义字段与数据库列的对应关系。

type User struct {
    ID    uint   `gorm:"primary_key"`
    Name  string `gorm:"size:255"`
    Email string `gorm:"type:varchar(100);unique_index"`
}

在这个例子中,gorm标签定义了ID字段为主键,Name字段的大小为255,Email字段为唯一索引且类型为varchar(100)

3. 验证

一些验证包使用struct标签来定义字段的验证规则。例如,gin框架中的binding标签可以用于验证API请求的数据。

type Login struct {
    User     string `form:"user" json:"user" binding:"required"`
    Password string `form:"password" json:"password" binding:"required"`
}

在这个例子中,binding:"required"标签告诉gin框架这些字段是必需的。

4. 反射

使用反射可以在运行时访问struct标签。通过反射获取字段的类型,然后可以访问该字段的标签。

type User struct {
    Name  string `mytag:"MyName"`
    Email string `mytag:"MyEmail"`
}

u := User{"Bob", "[email protected]"}
t := reflect.TypeOf(u)

for _, fieldName := range []string{"Name", "Email"} {
    field, _ := t.FieldByName(fieldName)
    fmt.Printf("Field: %s, Tag: %s\n", fieldName, field.Tag.Get("mytag"))
}

输出:

Field: Name, Tag: MyName
Field: Email, Tag: MyEmail

常见的Struct标签键

以下是一些常见的struct标签键及其用途: