这些各种验证库如何将这种元数据添加到以下结构中:
type Post struct {
Title string `valid:"alphanum,required"`
Message string `valid:"duck,ascii"`
AuthorIP string `valid:"ipv4"`
Date string `valid:"-"`
}
Run Code Online (Sandbox Code Playgroud)
我很困惑,属性是标题,类型是字符串。除此之外,您怎么能添加valid:"alphanum,required" 使用反射?
这就像其他语言中的属性吗?
[Required]
public int Title { get;set; }
Run Code Online (Sandbox Code Playgroud)
Go 没有一般意义上的属性。结构体中的字符串是结构体标签:
字段声明后面可以跟一个可选的字符串文字标签,该标签成为相应字段声明中所有字段的属性。这些标签通过反射接口变得可见,并参与结构的类型标识,但在其他情况下会被忽略。
Run Code Online (Sandbox Code Playgroud)// 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
Run Code Online (Sandbox Code Playgroud)
或者
//go:noinline
Run Code Online (Sandbox Code Playgroud)
这些是特定于编译器的,IIRC 不是语言规范的一部分。