英文:
how tags of struct fields are used?
问题
在Go语言中,结构体(struct
)中的字段标签(field tags)是用来为字段添加元数据的。字段标签是写在字段声明后面的字符串,用反引号(`)括起来。字段标签的作用是为字段提供额外的信息,例如字段的名称、类型、验证规则等。
当我们在结构体中使用字段标签时,这些标签会成为对应字段声明中所有字段的属性。这意味着,通过使用字段标签,我们可以为结构体中的每个字段添加自定义的属性或元数据。
字段标签的具体用途和含义取决于我们在代码中如何使用它们。一些常见的用途包括:
-
序列化和反序列化:字段标签可以用于指定字段在进行序列化和反序列化时的名称、格式或其他相关信息。
-
数据验证:字段标签可以用于指定字段的验证规则,例如最大长度、最小值等。
-
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".
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论