为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_花开花谢_0 2021-12-07 18:36:20
这些各种验证库如何将此元数据添加到结构中,例如: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; }
查看完整描述

2 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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 不是语言规范的一部分。


查看完整回答
反对 回复 2021-12-07
?
交互式爱情

TA贡献1712条经验 获得超3个赞

那些是标签。从语言规范(结构类型的结尾):

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

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

另外,来自反射包文档:

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

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

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

标签也广泛用于 json。从json 包文档:

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

该页面上加载了额外的数据

这个较早的问题也可能有帮助。


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信