Golang中是否允许使用元数据或属性?

时间:2016-02-04 15:46:38

标签: validation go

这些各种验证库如何将此元数据添加到结构中,如:

type Post struct {
    Title    string `valid:"alphanum,required"`
    Message  string `valid:"duck,ascii"`
    AuthorIP string `valid:"ipv4"`
    Date     string `valid:"-"`
}

我很困惑,属性是Title,类型是字符串。除此之外,您如何才能添加valid:"alphanum,required"这是否使用反射?

这是其他语言的属性吗?

[Required]
public int Title { get;set; }

2 个答案:

答案 0 :(得分:3)

Go在一般意义上没有属性。结构中的字符串是struct tags

  

字段声明后面可以跟一个可选的字符串文字标记,该标记成为相应字段声明中所有字段的属性。标签通过反射界面可见,并参与结构的类型标识,否则将被忽略。

// A struct corresponding to the TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers.
struct {
    microsec  uint64 "field 1"
    serverIP6 uint64 "field 2"
    process   string "field 3"
}

您无法添加或更改它们,但可以使用reflect包访问它们。

另一种看起来像属性的东西是“魔术评论”,如

// +build amd64

//go:noinline

这些是特定于编译器的,IIRC不是语言规范的一部分。

答案 1 :(得分:2)

这些是标签。从language spec(到结构类型的末尾):

  

字段声明后面可以跟一个可选的字符串文字标记,   它成为相应的所有字段的属性   现场申报。标签通过反射可见   接口并参与结构的类型标识,但不是   忽略。

根据上面的引用,您可以将它们与reflection一起使用。

另外,来自反射包doc:

  

StructTag是结构字段中的标记字符串。

     

按照惯例,标记字符串是可选的串联   以空格分隔的键:"值"对。每个键都是非空字符串   由空间以外的非控制字符组成(U + 0020''),   引用(U + 0022'"')和冒号(U + 003A':')。每个值都使用引用   U + 0022'"'字符和Go字符串文字语法。

上面的链接中有一个很好的可执行示例。

标签也广泛用于json。来自json package docs:

  

对象的默认键字符串是结构字段名称,但可以是   在struct field的标记值中指定。 " json"关键在于   struct field的标记值是键名,后跟可选项   逗号和选项。

有关page.

的大量额外数据

earlier question也可能有所帮助。