开发者学堂课程【Go语言核心编程 - 面向对象、文件、单元测试、反射、TCP编程:序列化 struct 时 tag 的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9739
序列化 struct 时 tag 的使用
一、序列化的补充
对结构体序列化完成时,把结构体字段名字作为 key,值为 val,字段名字有可能不满足需求,如在 web 中 go 服务器将结构体序列化后传入浏览器,浏览器向 jQuery 进行解析,浏览器也就是客户端通常希望 key 值都保持小写
1.注意事项
对于结构体的序列化,如果希望序列化后的 key 的名字,由自己重新制定,可以给 struct 指定一个 tag 标签.
//定义一个结构体
type Monster struct {
Name string `json:"monster_name"
´
//反射机制
Age int `json:"monster_age"`
Birthday string 77....
Sal float64
skill string
序列化后:
{"monster_name":"牛魔
王
","monster_age":500,"Birthday":"2011-11-11","'Sal":8000,"Skil":"牛魔拳"}
有人想将 Name 直接改完 monster_name 完全不可以,因为结构体进行序列化时用的是 marshal,json 是另外一个包,在 marshal 函数里使用字段跨包函数的,使用首字母小写为私有的,是不可导出的字段,在序列化时会报错,所以不可以直接写首字母小写的字段。
将 Name 改为 monster_name 测试结果
type Monster struct {
monster name string
Age int
Birthday string //...
sal float64
skill string
}
func teststruct(){
//演示
monster := Monster{
monster_name :"牛魔王
Age :500
Birthday:"2011-11-11",
Sal:8000.0
skill:"牛魔拳",
//将monster序列化
data, err := json. Marshal(&monster) //...
if err !=nil{
fmt.Printf("序列号错误 err=%v\n", err)
}
//输出序列化后的结果
fmt.Printf("monster 序列化后=%v\n",string(data))
序列化后虽然没有报错但是 monster_name 消失,因为 marshal 做了判断,可导出进行处理,不可导出不做处理
monster_name 在 mashal 中应用反射机制替换 Name