Go结构体里的Tag标签

struct 的 Tag 示例

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

如何获取 Tag 的信息

获取 Tag 可以分为三个步骤:

  1. 获取字段 field
  2. 获取标签 tag
  3. 获取键值对 key:value

获取 Tag 的示例

// 三种方式可获取 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")
  1. 获取键值对,有 Get 和 Lookup 两种方法。但其实 Get 只是对 Lookup 函数的简单封装而已,当没有获取到对应 tag 的内容时,会返回空字符串。
  2. 空 Tag 和不设置 Tag 效果是一样的。

单元示例

func Print(obj interface{}) error {
    // 取 Value
    v := reflect.ValueOf(obj)

    // 解析字段
    for i := 0; i < v.NumField(); i++ {

        // 取tag
        field := v.Type().Field(i)
        tag := field.Tag

        // 解析label 和 default
        label := tag.Get("label")
        defaultValue := tag.Get("default")

        value := fmt.Sprintf("%v", v.Field(i))
        if value == "" {
            // 如果没有指定值,则用默认值替代
            value = defaultValue
        }

        fmt.Println(label + value)
    }

    return nil
}