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

coo*_*eze 5 validation go

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

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)

Ain*_*r-G 5

Go 没有一般意义上的属性。结构体中的字符串是结构体标签

字段声明后面可以跟一个可选的字符串文字标签,该标签成为相应字段声明中所有字段的属性。这些标签通过反射接口变得可见,并参与结构的类型标识,但在其他情况下会被忽略。

// 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"
}
Run Code Online (Sandbox Code Playgroud)

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

另一件看起来像属性的东西是“神奇的评论”,比如

// +build amd64
Run Code Online (Sandbox Code Playgroud)

或者

//go:noinline
Run Code Online (Sandbox Code Playgroud)

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

  • @joshlf:语言规范之外的任何内容都是特定于实现的。像“构建约束”这样的记录注释被记录下来供 go“gc”工具链使用,而记录较少的注释(如“//go:noinline”)更多地供 go“gc”编译器内部使用。它们之所以出现在注释中,是因为它们不是语言规范的一部分,并且可以被其他编译器忽略。 (2认同)