类似于Go语言中的.NET属性。

huangapple go评论84阅读模式
英文:

Similar to .net attributes in Go

问题

在Go语言中,与.NET属性类似的功能是使用结构体的标签(tag)来实现的。结构体的标签是用于为结构体的字段附加元数据的字符串。这些标签可以在运行时通过反射来读取,并且可以用于实现类似于.NET属性的功能。

要在Go语言中实现类似.NET属性的功能,可以按照以下步骤进行操作:

  1. 定义一个结构体,并为其字段添加标签。例如:
type MyStruct struct {
    Field1 string `json:"field1"`
    Field2 int    `json:"field2"`
}

在上面的例子中,Field1Field2是结构体MyStruct的字段,而json:"field1"json:"field2"则是它们的标签。

  1. 使用反射来读取结构体字段的标签。可以使用reflect包中的TypeField方法来获取结构体字段的类型和标签。例如:
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属性的功能。你可以根据自己的需求为结构体字段添加不同的标签,并使用反射来读取这些标签的值。

英文:

What is similar to .net attributes in go lang.

Or how this could be achieved ?

答案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.

huangapple
  • 本文由 发表于 2014年5月30日 05:17:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/23943162.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定