猿问

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

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


type Post struct {

    Title    string `valid:"alphanum,required"`

    Message  string `valid:"duck,ascii"`

    AuthorIP string `valid:"ipv4"`

    Date     string `valid:"-"`

}

我很困惑,属性是标题,类型是字符串。除此之外你怎么能添加valid:"alphanum,required" 这是使用反射?


这与其他语言中的属性一样吗?


[Required]

public int Title { get;set; }


qq_花开花谢_0
浏览 185回答 2
2回答

斯蒂芬大帝

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"}您无法添加或更改它们,但可以使用reflect包访问它们。另一件有点像属性的东西是“神奇的评论”,比如// +build amd64或者//go:noinline这些是特定于编译器的,IIRC 不是语言规范的一部分。

交互式爱情

那些是标签。从语言规范(结构类型的结尾):字段声明后可以跟一个可选的字符串文字标签,它成为相应字段声明中所有字段的属性。这些标签通过反射接口可见,并参与结构的类型标识,否则会被忽略。根据上面的引用,您可以将它们与反射一起使用。另外,来自反射包文档:StructTag 是结构字段中的标记字符串。按照惯例,标签字符串是可选的空格分隔键:“值”对的串联。每个键都是一个非空字符串,由除空格 (U+0020 ' ')、引号 (U+0022 '"') 和冒号 (U+003A ':') 以外的非控制字符组成。每个值都用引号引起来使用 U+0022 '"' 字符和 Go 字符串文字语法。上面的链接中有一个很好的可执行示例。标签也广泛用于 json。从json 包文档:对象的默认键字符串是结构字段名称,但可以在结构字段的标签值中指定。struct 字段的标签值中的“json”键是键名,后跟可选的逗号和选项。该页面上加载了额外的数据。这个较早的问题也可能有帮助。
随时随地看视频慕课网APP

相关分类

Go
我要回答