面试题答案
一键面试结构体标签的作用
- 元数据存储:结构体标签用于为结构体字段存储额外的元数据。这些元数据不直接参与结构体实例的数据存储,但可以被特定的库或代码逻辑用于各种目的,例如序列化和反序列化、ORM(对象关系映射)操作等。
- 标记与配置:为结构体字段提供标记或配置信息,以指导外部工具或库如何处理该字段。
定义结构体标签
在Go语言中,结构体标签紧跟在字段类型之后,是一个用反引号括起来的字符串。例如:
type User struct {
Name string `json:"name" db:"name"`
Age int `json:"age" db:"age"`
}
在上述例子中,Name
字段有两个标签 json:"name"
和 db:"name"
。json:"name"
表示在JSON序列化和反序列化时,该字段对应的JSON键为 name
;db:"name"
表示在数据库相关操作(如ORM)中,该字段对应的数据库列名为 name
。
获取结构体标签的值
要获取结构体标签的值,通常需要使用反射(reflect
)包。以下是一个示例:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string `json:"name" db:"name"`
Age int `json:"age" db:"age"`
}
func main() {
var u User
typeOf := reflect.TypeOf(u)
for i := 0; i < typeOf.NumField(); i++ {
field := typeOf.Field(i)
jsonTag := field.Tag.Get("json")
dbTag := field.Tag.Get("db")
fmt.Printf("Field: %s, JSON Tag: %s, DB Tag: %s\n", field.Name, jsonTag, dbTag)
}
}
上述代码通过反射获取 User
结构体每个字段的标签值,并打印出来。运行结果如下:
Field: Name, JSON Tag: name, DB Tag: name
Field: Age, JSON Tag: age, DB Tag: age