Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Golang中值类型和指针类型在JSON序列化和反序列化时的表现_创想鸟

Golang中值类型和指针类型在JSON序列化和反序列化时的表现

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

golang中值类型和指针类型在json序列化和反序列化时的表现

在Go语言中,JSON序列化和反序列化由

encoding/json

包处理。值类型和指针类型在这过程中表现不同,但大多数情况下行为一致,关键在于字段是否存在以及字段的可导出性(首字母大写),而不是是否为指针。

值类型与指针类型的序列化(Marshal)

序列化时,

json.Marshal

会自动解引用指针字段,因此值类型和其对应指针类型生成的JSON内容通常相同。

示例:

定义结构体:

type Person struct {    Name string `json:"name"`    Age  int    `json:"age"`}

分别使用值和指针:

立即学习“go语言免费学习笔记(深入)”;

personVal := Person{Name: "Alice", Age: 30}personPtr := &personValjsonVal, _ := json.Marshal(personVal)jsonPtr, _ := json.Marshal(personPtr)// 输出都是:{"name":"Alice","age":30}

可见,指针在序列化时会被自动解引用,结果一致。

零值与nil指针的差异

当指针为

nil

时,序列化结果会变成

null

,而值类型总是使用其零值。

例如:

type Profile struct {    Nickname *string `json:"nickname"`}var nickname *string = nilprofile := Profile{Nickname: nickname}json.Marshal(profile) // 输出:{"nickname":null}

如果字段是值类型

Nickname string

,则输出为

""

(空字符串)。

这种差异在API设计中很重要,

null

可表示“未设置”,而空字符串表示“显式为空”。

反序列化(Unmarshal)时的指针优势

反序列化时,使用指针类型可以判断字段是否在JSON中出现,尤其是配合

omitempty

时。

例如:

type User struct {    Name     string  `json:"name"`    Age      *int    `json:"age,omitempty"`}

如果JSON中没有

age

字段,

age

字段将为

nil

;如果有,则指向具体值。

这允许你区分:

age

字段未提供(

nil

)

age

字段为0(

new(int)

,值为0)

而如果

Age int

是值类型,无法判断是默认零值还是JSON中提供了0。

嵌套结构体与指针字段

嵌套字段为指针时,反序列化能正确分配内存并填充数据。

例如:

type Address struct {    City string `json:"city"`}type Person struct {    Name     string    `json:"name"`    Address  *Address  `json:"address,omitempty"`}

即使

Address

字段是

*Address

,只要JSON中有

Address

对象,

json.Unmarshal

会自动创建

Address

实例并赋值给指针。

若JSON中无该字段,指针保持

nil

,可用于判断是否存在地址信息。

基本上就这些。Go的

json

包对指针处理很友好,关键在于理解

nil

和零值的语义差异,以及如何利用指针实现“可选字段”的精确表达。实际开发中,对可能缺失或需要区分“未设置”和“零值”的字段,使用指针类型更灵活。

以上就是Golang中值类型和指针类型在JSON序列化和反序列化时的表现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1401946.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何在Golang中引用本地正在开发尚未发布的模块
上一篇 2025年12月15日 18:15:40
reflect.DeepEqual在Golang中是如何工作的
下一篇 2025年12月15日 18:15:52

相关推荐

发表回复

登录后才能评论
关注微信