Go中JSON序列化时值类型与指针类型行为一致,因json.Marshal会自动解引用指针;但nil指针序列化为null,而零值字段使用默认值,如空字符串或0;反序列化时指针可区分字段是否提供,配合omitempty能判断字段是否存在,嵌套指针字段可自动分配内存;因此对需区分“未设置”与“零值”的场景,使用指针更灵活。

在Go语言中,JSON序列化和反序列化由
encoding/json
序列化时,
json.Marshal
定义结构体:
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
分别使用值和指针:
立即学习“go语言免费学习笔记(深入)”;
personVal := Person{Name: "Alice", Age: 30}
personPtr := &personVal
jsonVal, _ := json.Marshal(personVal)
jsonPtr, _ := json.Marshal(personPtr)
// 输出都是:{"name":"Alice","age":30}
可见,指针在序列化时会被自动解引用,结果一致。
当指针为
nil
null
例如:
type Profile struct {
Nickname *string `json:"nickname"`
}
var nickname *string = nil
profile := Profile{Nickname: nickname}
json.Marshal(profile) // 输出:{"nickname":null}
如果字段是值类型
Nickname string
""
这种差异在API设计中很重要,
null
反序列化时,使用指针类型可以判断字段是否在JSON中出现,尤其是配合
omitempty
例如:
type User struct {
Name string `json:"name"`
Age *int `json:"age,omitempty"`
}
如果JSON中没有
age
age
nil
这允许你区分:
age
nil
age
new(int)
而如果
Age int
嵌套字段为指针时,反序列化能正确分配内存并填充数据。
例如:
type Address struct {
City string `json:"city"`
}
type Person struct {
Name string `json:"name"`
Address *Address `json:"address,omitempty"`
}
即使
Address
*Address
Address
json.Unmarshal
Address
若JSON中无该字段,指针保持
nil
基本上就这些。Go的
json
nil
以上就是Golang中值类型和指针类型在JSON序列化和反序列化时的表现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号