Golang中逗号分隔字段的结构标记

时间:2018-02-14 17:46:33

标签: go struct

说我有一个类似的结构:

type MyType struct {
    A, B string
}

我可以在这些字段上添加标签吗?显然我可以把每个字段放在自己的行上。我很好奇是否可以用原始格式标记字段。

2 个答案:

答案 0 :(得分:3)

是的,你可以,但你不能标记单个字段。来自Language Reference

  

字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性

所以你可以说

type MyType struct {
  A, B string `my_tag`
}

但最终会AB标记为my_tag。对于必须使用的常见用例(JSON,Protobuf,...),这不是你想要的。

答案 1 :(得分:2)

您显然可以为MyType.AMyType.B指定标记值,但是您无法为这两个字段指定不同的标记值(除非您列出它们)在2个单独的字段声明中。)

引自Spec: Struct types:

  

字段声明后面可以跟一个可选的字符串文字标记,它将成为相应字段声明中所有字段的属性。

字段声明只能包含一个可选标记:

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"