英文:
Similar to .net attributes in Go
问题
在Go语言中,与.NET属性类似的功能是使用结构体的标签(tag)来实现的。结构体的标签是用于为结构体的字段附加元数据的字符串。这些标签可以在运行时通过反射来读取,并且可以用于实现类似于.NET属性的功能。
要在Go语言中实现类似.NET属性的功能,可以按照以下步骤进行操作:
- 定义一个结构体,并为其字段添加标签。例如:
type MyStruct struct {
Field1 string `json:"field1"`
Field2 int `json:"field2"`
}
在上面的例子中,Field1
和Field2
是结构体MyStruct
的字段,而json:"field1"
和json:"field2"
则是它们的标签。
- 使用反射来读取结构体字段的标签。可以使用
reflect
包中的Type
和Field
方法来获取结构体字段的类型和标签。例如:
t := reflect.TypeOf(MyStruct{})
field, _ := t.FieldByName("Field1")
tag := field.Tag.Get("json")
fmt.Println(tag) // 输出:"field1"
在上面的例子中,我们使用reflect.TypeOf
方法获取MyStruct
的类型,然后使用FieldByName
方法获取Field1
字段的信息,最后使用Tag.Get
方法获取字段的标签值。
通过这种方式,你可以在Go语言中实现类似.NET属性的功能。你可以根据自己的需求为结构体字段添加不同的标签,并使用反射来读取这些标签的值。
答案1
得分: 7
或许最相似的机制是结构标签(Struct Tags)。它们可能不是最优雅的,但可以在运行时进行评估,并提供有关结构成员的元数据。
根据反射包文档:type StructTag
它们被用于自定义元素名称的 JSON 和 XML 编码中。
例如,使用标准的 json 包,假设我有一个结构体,其中一个字段我不希望出现在我的 JSON 中,另一个字段只有在非空时才希望出现,还有一个字段我希望用不同于结构体内部名称的名称引用。下面是如何使用标签来指定:
type Foo struct {
Bar string `json:"-"` // 不会在 JSON 序列化中出现
Baz string `json:",omitempty"` // 只有在非空时才会出现在 JSON 中
Gaz string `json:"fuzz"` // 以 fuzz 作为名称出现,而不是 Gaz
}
我将其用于记录和验证 REST API 调用中的参数,以及其他用途。
如果保持 "可选的以空格分隔的 key:"value"" 语法,可以使用 StructTag 的 Get 方法来访问各个键的值,就像示例中所示。
英文:
Perhaps the most similar mechanism is Struct Tags. Not the most elegant, but they can be evaluated at runtime and provide metadata on struct members.
From the reflect package documentation: type StructTag
They are used, for example, in JSON and XML encoding for custom element names.
For example, using the standard json package, say I have a struct with a field I don't want to appear in my JSON, another field I want to appear only if it is not empty, and a third one I want to refer to with a different name than the struct's internal name. Here's how you specify it with tags:
type Foo struct {
Bar string `json:"-"` //will not appear in the JSON serialization at all
Baz string `json:",omitempty"` //will only appear in the json if not empty
Gaz string `json:"fuzz"` //will appear with the name fuzz, not Gaz
}
I'm using it to document and validate parameters in REST API calls, among other uses.
If you keep the 'optionally space-separated key:"value"' syntax, you can use the Get Method of StructTag to access the values of individual keys, as in the example.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论