golang tag
tag 是针对 struct field 的补充说明
tag 可以是 kv 形式,也可以字符串形式(比如设置标记属性)
如果只是字符串形式,就不要使用 tag.Lookup 方法了,这个是针对 kv 的。 那个 bool 的返回值是用来标识 value 是否存在,而非 key 是否存在
golang 对 tag 的处理是通过字符读取,然后通过分割字符来进行分组,以及区分 key 和 value 的
下面的代码可以理解成分组的获取,以及 key 的获取
for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
i++
}
name := string(tag[:i]) // 获取 key
tag = tag[i+1:] // 执行偏移
下面这段代码则是获取 value 部分
i = 1
for i < len(tag) && tag[i] != '"' {
if tag[i] == '\\' {
i++
}
i++
}
if i >= len(tag) {
break
}
qvalue := string(tag[:i+1]) // 获取 value
tag = tag[i+1:] // 偏移
字符标签的获取
type s4 struct {
fiedl1 string `tag1`
}
func tagTest() {
a := s4{}
t := reflect.TypeOf(a)
println(fmt.Sprintf("%s tag 输出: %s ", t.Field(0).Name, t.Field(0).Tag))
// 字符 tag 的错误判断方法
if _, ok := t.Field(0).Tag.Lookup("tag1"); !ok {
println("没有 tag1 (错误判断)")
}
// 字符 tag 的正确判断(简单实现)
if strings.Contains(string(t.Field(0).Tag), "tag1") {
println("有 tag1 (正确判断)")
}
}
输出如下
fiedl1 tag 输出: tag1
没有 tag1 (错误判断)
有 tag1 (正确判断)