这些各种验证库如何将此元数据添加到结构中,如:
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; }
答案 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也可能有所帮助。