结构体字段的标签是如何使用的?

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

how tags of struct fields are used?

问题

在Go语言中,结构体(struct)中的字段标签(field tags)是用来为字段添加元数据的。字段标签是写在字段声明后面的字符串,用反引号(`)括起来。字段标签的作用是为字段提供额外的信息,例如字段的名称、类型、验证规则等。

当我们在结构体中使用字段标签时,这些标签会成为对应字段声明中所有字段的属性。这意味着,通过使用字段标签,我们可以为结构体中的每个字段添加自定义的属性或元数据。

字段标签的具体用途和含义取决于我们在代码中如何使用它们。一些常见的用途包括:

  1. 序列化和反序列化:字段标签可以用于指定字段在进行序列化和反序列化时的名称、格式或其他相关信息。

  2. 数据验证:字段标签可以用于指定字段的验证规则,例如最大长度、最小值等。

  3. ORM(对象关系映射):在使用ORM框架时,字段标签可以用于指定字段与数据库表中列的映射关系。

总之,字段标签为我们提供了一种在结构体字段上添加元数据的方式,以便在需要时能够根据这些元数据进行相应的处理。

英文:

I do not understand how field tags in struct are used and when. Per https://golang.org/ref/spec#Struct_types:

> [tag] becomes an attribute for all the fields in the corresponding field declaration

what does this mean?

答案1

得分: 1

“[tag]成为相应字段声明中所有字段的属性”

除了上面的链接(“Go中标签的用途是什么?”,“go lang,struct:第三个参数是什么”),这个线程提供了一个不来自标准包的示例:

假设我有以下代码(见下文)。我使用类型开关来检查WhichOne()中参数的类型。

我如何访问标签(在两种情况下都是“blah”)?
我是否被迫使用反射包,还是可以在“纯粹”的Go中完成?

type PersonAge struct {
    name string "blah"
    age  int
}

type PersonShoe struct {
    name     string "blah"
    shoesize int
}

func WhichOne(x interface{}) {
    ...
}

在阅读了上述内容之后,查看了json/encode.go并进行了一些试错之后,我找到了一个解决方案。要打印出以下结构体中的“blah”:

type PersonAge struct {
    name string "blah"
    age  int
}

你需要:

func WhichOne(i interface{}) {
    switch t := reflect.NewValue(i).(type) {
    case *reflect.PtrValue:
        x := t.Elem().Type().(*reflect.StructType).Field(0).Tag
        println(x)
    }
}

这里的Field(0).Tag说明了“[tag]成为相应字段声明中所有字段的属性”。

英文:

> [tag] becomes an attribute for all the fields in the corresponding field declaration

In addition to the links above ("What are the use(s) for tags in Go?", "go lang, struct: what is the third parameter") this thread provides an example which does not come from the standard packages:

> Suppose I have the following code (see below). I use a type switch the check the type of the argument in WhichOne().
>
> How do I access the tag ("blah" in both cases)?
I'm I forced the use the reflection package, or can this also be done in "pure" Go?

type PersonAge struct {
        name string "blah"
        age  int
}

type PersonShoe struct {
        name     string "blah"
        shoesize int
}

func WhichOne(x interface{}) {
    ...
}

> After reading that (again), looking in json/encode.go and some trial and error, I have found a solution.
To print out "blah" of the following structure:

type PersonAge struct {
        name string "blah"
        age  int
}

> You'll need:

func WhichOne(i interface{}) {
        switch t := reflect.NewValue(i).(type) {
        case *reflect.PtrValue:
                x := t.Elem().Type().(*reflect.StructType).Field(0).Tag
                println(x)
        }  
}

Here: Field(0).Tag illustrates the "becomes an attribute for all the fields in the corresponding field declaration".

huangapple
  • 本文由 发表于 2015年1月2日 05:39:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/27734934.html
匿名

发表评论

匿名网友

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

确定