说我有一个类似的结构:
type MyType struct {
A, B string
}
我可以在这些字段上添加标签吗?显然我可以把每个字段放在自己的行上。我很好奇是否可以用原始格式标记字段。
答案 0 :(得分:3)
是的,你可以,但你不能标记单个字段。来自Language Reference:
字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性
所以你可以说
type MyType struct {
A, B string `my_tag`
}
但最终会A
和B
标记为my_tag
。对于必须使用的常见用例(JSON,Protobuf,...),这不是你想要的。
答案 1 :(得分:2)
您显然可以为MyType.A
和MyType.B
指定标记值,但是您无法为这两个字段指定不同的标记值(除非您列出它们)在2个单独的字段声明中。)
字段声明后面可以跟一个可选的字符串文字标记,它将成为相应字段声明中所有字段的属性。
字段声明只能包含一个可选标记:
StructType = "struct" "{" { FieldDecl ";" } "}" . FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] . EmbeddedField = [ "*" ] TypeName . Tag = string_lit .
见这个例子:
type MyType struct {
A, B string `mytag:"AB"`
}
m := MyType{"a", "b"}
t := reflect.TypeOf(m)
for _, fieldName := range []string{"A", "B"} {
field, found := t.FieldByName(fieldName)
if !found {
continue
}
fmt.Printf("\nField: MyType.%s\n", fieldName)
fmt.Printf("\tWhole tag value : %q\n", field.Tag)
fmt.Printf("\tValue of 'mytag': %q\n", field.Tag.Get("mytag"))
}
输出(在Go Playground上尝试):
Field: MyType.A
Whole tag value : "mytag:\"AB\""
Value of 'mytag': "AB"
Field: MyType.B
Whole tag value : "mytag:\"AB\""
Value of 'mytag': "AB"