Go结构体里的Tag标签
struct 的 Tag 示例
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Addr string `json:"addr,omitempty"`
}
如何获取 Tag 的信息
获取 Tag 可以分为三个步骤:
- 获取字段 field
- 获取标签 tag
- 获取键值对 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")
- 获取键值对,有 Get 和 Lookup 两种方法。但其实 Get 只是对 Lookup 函数的简单封装而已,当没有获取到对应 tag 的内容时,会返回空字符串。
- 空 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
}