讲师中心 微信公众号
AI工具推荐 视频效率加速

JSON 序列化与反序列化中指针语义的注意事项

酷磊君_6632

酷磊君_6632

发布时间:2026-10-03 22:25:06

|

501人浏览过

|

来源于php中文网

原创

JSON 序列化与反序列化中指针语义的注意事项

Go 的 json 包在编码/解码结构体时,会将指针解引用后序列化其指向的值;反序列化时则为每个字段独立分配新内存并构造新对象,因此原指针的同一性(== 比较)必然丢失,但值相等性仍可保证。

go 的 `json` 包在编码/解码结构体时,会将指针解引用后序列化其指向的值;反序列化时则为每个字段**独立分配新内存并构造新对象**,因此原指针的同一性(`==` 比较)必然丢失,但值相等性仍可保证。

在 Go 中,encoding/json 对指针类型的处理是明确且符合设计预期的:它不保留指针身份(identity),只保留值语义(value semantics)。当你对一个包含 []*J 字段的结构体 N 调用 json.Marshal() 时,json 包会递归地解引用每个 *J,并将 J 的字段以 JSON 对象形式写出;而 json.Unmarshal() 在还原时,会对每个 J 实例分别分配新的内存地址,再构建新的 *J 指针。这意味着即使原始 n.A[0] 和 n.B[0] 指向同一个 J 实例(即 n.A[0] == n.B[0] 为 true),经 JSON round-trip 后,它们将指向两个内容相同、但地址不同的 J 实例,因此指针比较结果变为 false。

这是完全符合 Go 官方文档定义的行为。encoding/json 文档明确指出:

“Pointer values encode as the value pointed to.”
“When unmarshaling into a pointer, if the JSON value is null, the pointer is set to nil. Otherwise, the pointer is allocated and the value is unmarshaled into the new memory.”

Wjs Localizing Video
Wjs Localizing Video

用于端到端视频本地化流程的轻量编排器,路由至四个专注子技能——/wjs-transcribing-audio、/wjs-translating-subtitles...

下载

✅ 正确的验证方式是比较值而非指针:

// ✅ 比较解引用后的结构体内容(要求 J 实现可比较,如无 map/slice/func 字段)
if *n.A[0] == *n.B[0] {
    fmt.Println("values are identical") // 此判断在 encode/decode 后依然成立
}

⚠️ 注意事项:

  • 若 J 包含不可比较字段(如 map[string]int、[]string、func() 等),则 *n.A[0] == *n.B[0] 编译不通过。此时应使用 reflect.DeepEqual(*n.A[0], *n.B[0]) 进行深度比较(注意性能开销);
  • 若业务逻辑强依赖对象身份(例如通过指针唯一标识某个状态节点、或用于 sync.Map 键、或需避免重复初始化),JSON 并非合适载体——应改用 gob(支持指针和类型信息)、自定义二进制格式,或在 JSON 基础上引入 ID 映射层(如用 "id": "j-123" 字段重建引用关系);
  • 示例代码中 Open() 函数存在类型错误:var n NeuralNetwork 与 type N struct {...} 不一致,且 return &n 返回局部变量地址(虽因逃逸分析实际可行,但易引发混淆),建议改为 var n N 并直接返回 &n 或更安全地返回 n(若无需指针)。

总结:JSON 是纯数据交换格式,不承载运行时对象图结构。当需要保持引用一致性时,请勿依赖指针相等性,而应基于业务语义设计显式标识机制(如 ID 字段 + 引用解析),或选用支持引用保真度的序列化方案。

热门AI工具

更多
Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2095

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3142

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1056

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3579

2025.09.10

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

339

2026.04.23

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

0

2026.10.15

Vue.js 中 ref 和 reactive 的区别
Vue.js 中 ref 和 reactive 的区别

Vue.js中ref和reactive的区别专题汇集两种响应式API的定义、访问方式、对象解构、侦听与性能取舍等文章,帮助结合实际状态类型选择合适写法。

0

2026.10.15

VS Code 怎么配置开发环境
VS Code 怎么配置开发环境

VS Code开发环境专题汇集编辑器安装、语言扩展、编译器、解释器、终端和调试配置文章,覆盖Java、Python、C++和PHP等常见语言的入门设置。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn