📜  Golang 程序在结构体类型定义中使用字段标签(1)

📅  最后修改于: 2023-12-03 15:15:23.703000             🧑  作者: Mango

Golang 程序在结构体类型定义中使用字段标签

在 Golang 中,我们可以在结构体类型定义中使用字段标签来给字段添加元数据,例如 JSON 序列化时的字段名、ORM 映射时的表名和列名等。

定义一个有字段标签的结构体类型

下面是一个定义了字段标签的结构体类型:

package main

import "fmt"

type User struct {
    ID       int    `json:"id" db:"user_id"`
    Name     string `json:"name" db:"user_name"`
    Age      int    `json:"age" db:"user_age"`
    Birthday string `json:"birthday" db:"user_birthday"`
}

func main() {
    user := User{
        ID:       100,
        Name:     "张三",
        Age:      18,
        Birthday: "2001-01-01",
    }

    fmt.Printf("%#v\n", user)
}

在上面的代码中,我们定义了一个结构体类型 User,它有 4 个字段,分别是 IDNameAgeBirthday。我们给这些字段添加了不同的字段标签,其中 json 标签表示在 JSON 序列化时的字段名,db 标签表示在 ORM 映射时的表名和列名。

使用反射获取字段标签

我们可以使用反射来获取结构体类型中字段的标签,例如:

...
import "reflect"

func main() {
    ...
    v := reflect.ValueOf(user)
    t := v.Type()

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        jsonTag := field.Tag.Get("json")
        dbTag := field.Tag.Get("db")
        fmt.Printf("%s: %s, %s\n", field.Name, jsonTag, dbTag)
    }
}

在上面的代码中,我们使用了 reflect 包来获取 User 结构体类型中的字段信息。在循环中,我们使用 Field 方法获取第 i 个字段信息,然后使用 Tag.Get 方法获取其 jsondb 标签的值,并打印出来。

输出结果为:

ID: id, user_id
Name: name, user_name
Age: age, user_age
Birthday: birthday, user_birthday
注意事项
  • 字段标签必须写在字段类型的后面,并用反引号括起来。
  • 字段标签中可以包含多个键值对,每个键值对之间用空格分隔。
  • 字段标签中的键和值之间用冒号分隔。
  • 字段标签不会被编译器使用,只能在运行时使用反射获取。
  • 字段标签一般是用于序列化、反序列化和 ORM 映射等场景下的元数据。