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

如何在 Go 中同时序列化和反序列化含导出与非导出字段的结构体

落枫同学_6512

落枫同学_6512

发布时间:2026-01-11 22:42:09

|

726人浏览过

|

来源于php中文网

原创

如何在 Go 中同时序列化和反序列化含导出与非导出字段的结构体

go 的 json 包默认忽略非导出(小写首字母)字段,但通过自定义 marshaljson 和 unmarshaljson 方法,可显式控制所有字段的 json 编解码行为,无需暴露内部字段。

在 Go 中,encoding/json 包仅能访问结构体的导出字段(即首字母大写的字段),因此像 fieldA string 这样的非导出字段默认不会参与 JSON 序列化。若需同时处理导出与非导出字段,不能依赖嵌入原结构体的方式递归调用 json.Marshal(如 *Test 嵌入会导致无限递归),而应采用「中间结构体(DTO)」策略:定义一个纯导出字段的辅助结构体,作为 JSON 编解码的桥梁。

以下是一个清晰、安全且可维护的实现方案:

type Test struct {
    fieldA string // 非导出,仅内部使用
    FieldB int    // 导出,可被 json 默认处理,但此处统一由自定义逻辑控制
    FieldC string // 导出
}

// TestJSON 是专用于 JSON 传输的导出结构体,字段全部大写且带 json 标签
type TestJSON struct {
    FieldA string `json:"fieldA"`
    FieldB int    `json:"fieldB"`
    FieldC string `json:"fieldC"`
}

func (t *Test) MarshalJSON() ([]byte, error) {
    return json.Marshal(TestJSON{
        FieldA: t.fieldA,
        FieldB: t.FieldB,
        FieldC: t.FieldC,
    })
}

func (t *Test) UnmarshalJSON(b []byte) error {
    var temp TestJSON
    if err := json.Unmarshal(b, &temp); err != nil {
        return err
    }
    // 显式赋值回原结构体,保持封装性
    t.fieldA = temp.FieldA
    t.FieldB = temp.FieldB
    t.FieldC = temp.FieldC
    return nil
}

✅ 优势说明:

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
  • 无递归风险:不嵌入 *Test,彻底避免 MarshalJSON 自调用导致的栈溢出;
  • 类型安全:TestJSON 是独立结构体,字段名与标签明确,修改 Test 字段时只需同步更新 TestJSON 和编解码逻辑,IDE 可精准提示;
  • 封装性完好:fieldA 仍为非导出字段,外部包无法直接访问,仅通过 JSON 接口可控暴露;
  • 扩展友好:新增字段时,只需在 TestJSON 中添加对应字段及 MarshalJSON/UnmarshalJSON 中的赋值语句,逻辑集中、不易遗漏。

⚠️ 注意事项:

  • UnmarshalJSON 中必须使用 &temp(取地址)传递指针给 json.Unmarshal,否则解码无效;
  • 若 Test 包含嵌套结构体或需要深度复制的字段(如切片、map),应在 UnmarshalJSON 中进行深拷贝,避免外部修改影响内部状态;
  • 不建议为简单场景强行保留非导出字段——若 fieldA 本质是公共数据,直接导出(FieldA)并利用 json 标签更简洁;本方案适用于确有封装需求(如字段需校验、惰性加载或权限控制)的场景。

总之,中间结构体法是 Go 中平衡封装性与序列化灵活性的标准实践,比手动拼接 JSON 字符串或反射更安全、比全字段导出更严谨。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

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

DeepSeek

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

2195

2023.08.07

json是什么
json是什么

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

3422

2023.08.23

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

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

1156

2023.10.13

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

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

3939

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6699

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

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

精品课程

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

共101课时 | 21.2万人学习

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

共39课时 | 4.9万人学习

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

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