Go 语言系列14:结构体
type Person struct {
    Name   string
    Age    int
    Gender string
}


Tag 的使用

但这一期要讲的是在字段上增加一个属性,这个属性是用反引号括起来的一个字符串,我们称之为 Tag(标签) 。例如:

type Person struct {
 Name   string `json:"name"`
 Age    int    `json:"age"`
 Gender string `json:"gender,omitempty"`
}
Tagkey:"value"TagJSON
jsonTagjsonJSONTotalCountJSONtotal_count
genderTagomitemptyJSONfalse
package main

import (
 "encoding/json"
 "fmt"
)

type Person struct {
 Name   string `json:"name"`
 Age    int    `json:"age"`
 Gender string `json:"gender,omitempty"`
}

func main() {
 // Person 1 without Gender
 person1 := Person{
  Name: "菜籽",
  Age: 25,
 }
 // 结构体转为 JSON
 data1, err := json.Marshal(person1)
 if err != nil {
  panic(err)
 }
 // person1 won't print Gender attribute
 fmt.Printf("%s\n", data1)

 // Person 2 have Gender attribute
 person2 := Person{
  Name: "Tom",
  Age: 18,
  Gender: "male",
 }
 // 结构体转为 JSON
 data2, err := json.Marshal(person2)
 if err != nil {
  panic(err)
 }
 // person2 will print Gender attribute
 fmt.Printf("%s\n", data2)
}

运行该程序输出如下的结果:

{"name":"菜籽","age":25}
{"name":"Tom","age":18,"gender":"male"}
GenderomitemptyJSONGender

Tag 的获取

key:"value"
`key1:"value1" key2:"value2" key3:"value3"`

那么我们如何获取到结构体中的 Tag 呢?这里我们用反射的方法。

使用反射的方法获取 Tag 步骤如下:

  1. 获取字段
  2. 获取 Tag
  3. 获取键值对

其中获取字段有三种方式,而获取键值对有两种方式。

// 三种获取 field
field := reflect.TypeOf(obj).FieldByName("Name")
field := reflect.ValueOf(obj).Type().Field(i)  // i 表示第几个字段
field := reflect.ValueOf(&obj).Elem().Type().Field(i)  // i 表示第几个字段

// 获取 Tag
tag := field.Tag 

// 获取键值对
labelValue := tag.Get("label")
labelValue,ok := tag.Lookup("label")
// Get 当没有获取到对应 Tag 的内容,会返回空字符串

下面是一个获取 Tag 以及键值对的例子:

package main

import (
 "fmt"
 "reflect"
)

type Person struct {
 Name   string `json:"name"`
 Age    int    `json:"age"`
 Gender string `json:"gender,omitempty"`
}

func main() {
 p := reflect.TypeOf(Person{})
 name, _ := p.FieldByName("Name")
 tag := name.Tag
 fmt.Println("Name Tag :", tag)
 keyValue, _ := tag.Lookup("json")
 fmt.Println("key: json, value:", keyValue)
}

运行上面的程序输出如下:

Name Tag : json:"name"
key: json, value: name

参考文献:

[1] Alan A. A. Donovan; Brian W. Kernighan, Go 程序设计语言, Translated by 李道兵, 高博, 庞向才, 金鑫鑫 and 林齐斌, 机械工业出版社, 2017.