go的json序列化,以及tag使用
json 序列化
package main
import (
"encoding/json"
"fmt"
)
type User struct {
UserName string `json:"姓名"` // 有了tag,序列化出来的就是tag中的名字
Sex string `json:"性别"`
Score float32 // 没有设置tag默认是自己的
age int32 // 小写的是私有的, 其他包不可以访问,json序列化时会自动把这个给忽略<details>
}
func test(){
user := &User{
UserName:"user01",
Sex:"男",
Score:99.5,
age: 23, // 小写的不会序列化进入json的函数中
}
data,_ := json.Marshal(user)
fmt.Printf("bytes str:%v\n",data)
fmt.Printf("json str:%s\n",string(data))
}
func main(){
test()
}
输出:
bytes str:[123 34 229 167 147 229 144 141 34 58 34 117 115 101 114 48 49 34 44 34 230 128 167 229 136 171 34 58 34 231 148 183 34 44 34 83 99 111 114 101 34 58 57 57 46 53 125]
json str:{"姓名":"user01","性别":"男","Score":99.5}
思考问题:
为什么序列化后,key-val的key值是结构体Tag的值,而不是字段的名称,比如:不是UserName而是: "姓名”:”user01”
引出反射:(note:学习reflect后,回头来解决)
tag使用:
package main
import (
"fmt"
"reflect"
)
//type Tag struct {
// field1 bool `name:"first field" id:"1"`
//}
type Tag struct {
field1 bool `name:"first field" id:"1"`
field2 string `name:"second field" id:"2"`
field3 int `name:"third field" id:"3"`
}
func main() {
tag := Tag{
field1: false,
field2: "Bob",
field3: 99}
t := reflect.TypeOf(tag)
fmt.Println("00>> ", t.Field(0).Tag)
fmt.Println("01>> ", t.Field(1).Tag)
fmt.Println("02>> ", t.Field(2).Tag)
fmt.Println("03>> ", t.Field(0).Tag.Get("name"),t.Field(0).Tag.Get("id"))
fmt.Println("04>> ", t.Field(1).Tag.Get("name"),t.Field(0).Tag.Get("id"))
fmt.Println("05>> ", t.Field(2).Tag.Get("name"),t.Field(0).Tag.Get("id"))
}
输出:
00>> name:"first field" id:"1"
01>> name:"second field" id:"2"
02>> name:"third field" id:"3"
03>> first field 1
04>> second field 1
05>> third field 1
写入自己的博客中才能记得长久
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!