Go语言中的文件与IO:JSON、CSV、XML处理

在数据交换与存储中,JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持,涵盖结构体映射、读写文件、编码解码等操作。


一、JSON处理(encoding/json

1. 基本使用:结构体 <-> JSON
type User struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email,omitempty"` // 可选字段
}user := User{Name: "Alice", Age: 30}
data, _ := json.Marshal(user)
fmt.Println(string(data)) // {"name":"Alice","age":30}
2. 反序列化 JSON -> 结构体
jsonStr := `{"name":"Bob","age":25}`
var u User
err := json.Unmarshal([]byte(jsonStr), &u)
fmt.Printf("%+v\n", u)
3. 处理嵌套结构、数组、map
type Post struct {ID     intAuthor UserTags   []string
}post := Post{ID: 1, Author: user, Tags: []string{"go", "json"}}
jsonBytes, _ := json.MarshalIndent(post, "", "  ")
fmt.Println(string(jsonBytes))

二、CSV处理(encoding/csv

CSV 通常用于表格数据、Excel 导出等,Go 提供简单读写接口。

1. 写入 CSV 文件
file, _ := os.Create("data.csv")
defer file.Close()writer := csv.NewWriter(file)
writer.Write([]string{"Name", "Age", "Email"})
writer.Write([]string{"Tom", "22", "tom@example.com"})
writer.Flush()
2. 读取 CSV 文件
file, _ := os.Open("data.csv")
defer file.Close()reader := csv.NewReader(file)
records, _ := reader.ReadAll()
for _, record := range records {fmt.Println(record)
}
3. 自定义分隔符(如 ;
reader := csv.NewReader(file)
reader.Comma = ';'

CSV 不支持结构体直接映射,需手动转换。


三、XML处理(encoding/xml

1. 基本结构体标签
type Note struct {To      string `xml:"to"`From    string `xml:"from"`Message string `xml:"message"`
}
2. 序列化:结构体 -> XML
note := Note{"Tom", "Jerry", "Hello, XML!"}
data, _ := xml.MarshalIndent(note, "", "  ")
fmt.Println(xml.Header + string(data))

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Note><to>Tom</to><from>Jerry</from><message>Hello, XML!</message>
</Note>
3. 反序列化:XML -> 结构体
input := `<Note><to>Tom</to><from>Jerry</from><message>Hi</message></Note>`
var n Note
xml.Unmarshal([]byte(input), &n)
fmt.Printf("%+v\n", n)
4. 属性与嵌套结构
type Book struct {Title  string `xml:"title,attr"`Author string `xml:"author"`
}type Library struct {XMLName xml.Name `xml:"library"`Books   []Book   `xml:"book"`
}

四、三者对比与适用场景

格式特点场景
JSON结构清晰、易于网络传输Web API、前后端通信
CSV体积小、表格友好报表导入导出、数据分析
XML可扩展、支持属性与命名空间配置文件、SOAP、嵌套数据

五、实战建议

  • • 使用 json.MarshalIndent 便于调试输出。
  • • 自定义字段名与 omitempty 控制输出字段。
  • • csv 通常用于轻量级数据交换,不建议嵌套。
  • • 解析 XML 时注意标签与命名空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85782.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三种语言写 MCP

参考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…

Python训练营-Day38-Dataset和Dataloader类

在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的方法。为此&#xff0c;PyTorch提供了DataLoader类&#xff0c;该类可以自动将数据集切分为多个批次batch&#xff0c;并支持多线程加载数据。此外&#xff0c;还存在Datase…

SVN上传代码

SVN&#xff08;Subversion&#xff09;是一个常用的版本控制系统&#xff0c;提供了对代码管理和协作的支持。以下是SVN常见操作&#xff08;如获取代码、上传代码、合并冲突处理等&#xff09;的命令行流程及实例&#xff1a; 1. 获取代码&#xff08;Checkout&#xff09; 在…

【appium】2.初始连接脚本配置

连接配置 from appium import webdriver desired_caps {platformName: Android,automationName: UIAutomator2,deviceName: ZTEB880,appPackage: com.taobao.taobao,appActivity: com.taobao.tao.welcome.Welcome,noReset: True }driver webdriver.Remote(http://localhost:…

FliTik翻页时钟v1.1.25.36,支持安卓TV/手机/车机+windows电脑端

FliTik翻页时钟v1.1.25.36&#xff0c;支持安卓TV/手机/车机windows电脑端 FliTik翻页时钟是一款集高颜值与强大功能于一身的全平台数字时钟工具类应用&#xff0c;支持TV、iOS、安卓、PC以及鸿蒙系统。它不仅拥有精美的翻页动画…

以AI赋能创意未来:即梦3.0与Seedance1.0Lite重磅登陆POE!

近年来&#xff0c;随着人工智能技术的不断突破&#xff0c;AI模型的应用场景也在逐渐拓宽。在这一过程中&#xff0c;如何整合和利用现有的AI技术&#xff0c;实现更为便捷的创作服务&#xff0c;成为了许多科技企业关注的焦点。近日&#xff0c;全球知名的AI模型整合平台POE正…

云计算与5G:如何利用5G网络优化云平台的性能

想象一下&#xff0c;你正在用手机看视频、进行在线游戏&#xff0c;甚至是使用云存储来保存你的重要文件。所有这些背后&#xff0c;其实都离不开一个无形的力量——云计算。而今天&#xff0c;5G网络的出现&#xff0c;就像为这些云服务加装了一对翅膀&#xff0c;让它们飞得…

GPT-1 与 BERT 架构

GPT-1 架构特点 仅解码器架构&#xff1a;摈弃了传统transformer中的编码器层&#xff0c;而是直接用解码器和自注意力&#xff0c;同时抛弃掉了交叉多头注意力层&#xff0c;自注意力通过mask来完成计算。注意力块添加到12个&#xff0c;Attention的输出维数为762维&#xff0…

Day04_C语言基础数据结构重点复习笔记20250618

1.什么是计算机的大小端存储&#xff1f; 答&#xff1a;大端是数据的高位字节存储在低地址&#xff0c;低位字节存储在高地址&#xff0c;网络协议&#xff08;如TCP/IP&#xff09;通常采用大端序&#xff08;称为“网络字节序”&#xff09;。例如&#xff1a;32位整数 0x12…

基于OpenSSL实现AES-CBC 128算法的 SeedKey DLL的生成与使用

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

进程间通信、线程间通信

进程间通信、线程间通信 进程间通行&#xff08;Inter-Process Communication&#xff0c; IPC&#xff09;和线程间通信&#xff08;Thread Communication&#xff09;的方式不完全相同&#xff0c;因为进程和线程的运行环境和特性不同 进程和线程的本质区别 进程 进程是操…

【FPGA学习】FPGA入门学习即数字逻辑复习

前言&#xff1a;最近开始学习FPGA了&#xff0c;希望通过博客记录下每一次学习的过程&#xff0c;与大家共勉。 目录 一、组合逻辑电路的设计&#xff08;工程学习引入&#xff09; 二、3-8译码器设计、下载和功能演示&#xff08;在的8段数码管显示&#xff09; 2.1 Logs…

ffmpeg python rgba图片合成 4444格式mov视频,保留透明通道

def convert_pngs_to_mov(input_pattern, output_path, frame_rate30):"""将BGRA四通道PNG序列转换为ProRes 4444编码的MOV视频&#xff08;保留透明通道&#xff09;参数:input_pattern: PNG序列路径模式&#xff08;如&#xff1a;"/path/to/frames/fram…

Java 实现 PDF 转图片功能:实战教程 + 场景解析

作者:云起川南|专注 Java 实战与自动化集成 在 PDF 文档处理的各类业务场景中,“将 PDF 页面转为图片”是一个高频、刚需的功能,广泛应用于 预览展示、文件归档、图片加密水印、OCR 文本识别 等系统中。 本文将带你一步一步实战如何使用 Java 实现 PDF 转图片 功能,使用开…

面试题-有个对象key全部是string,值全部是number要定义他,不使用interface和type如何定义

在 TypeScript 里&#xff0c;若要定义一个键为string类型、值为number类型的对象&#xff0c;并且不使用interface和type&#xff0c;可以采用以下几种方式&#xff1a; 1. 内联类型注解&#xff08;Inline Type Annotation&#xff09; 直接在变量声明时使用索引签名进行类…

领域驱动设计(DDD)【3】之事件风暴

文章目录 说明一 事件风暴理论知识1.1 事件风暴的核心目标1.2事件风暴的关键步骤1.2.1 准备工作1.2.2 核心流程1.2.3 事件风暴的输出 1.3 事件风暴的优势1.4 常见问题Q1&#xff1a;事件风暴适合所有项目吗&#xff1f;Q2&#xff1a;事件风暴后如何落地&#xff1f;Q3&#xf…

Vue3中监听 Ref 类型的数字数组

在 Vue 3 中&#xff0c;监听一个 Ref 类型的数字数组&#xff08;如 ref<number[]>([])&#xff09;时&#xff0c;根据需求的不同&#xff0c;有几种监听方式&#xff1a; 1. 监听整个数组的引用变化 当整个数组被重新赋值时触发&#xff1a; typescript 复制 下载…

PoolThreadCache 类的结构和源码实现

PoolThreadCache 在 Netty 的内存池中扮演着线程本地缓存的角色。它的主要目的是减少线程在分配内存时对全局 PoolArena 的竞争&#xff0c;通过缓存一部分最近释放的内存块&#xff0c;使得同一线程后续申请相同规格的内存时能够快速获取&#xff0c;从而提高分配效率。 下面…

Linux中的阻塞信号与信号原理

在Linux操作系统中&#xff0c;信号&#xff08;Signal&#xff09;是进程间通信和进程控制的核心机制之一。信号是一种异步通知机制&#xff0c;可以向进程发送异步事件通知&#xff0c;以便进程能够处理系统级别的事件。本文将详细探讨Linux中的信号原理&#xff0c;重点讲解…

QT学习教程(三十五)

事件处理&#xff08;- Event Processingn&#xff09; 事件是视窗系统或者Qt 本身在各种不同的情况下产生的。当用户点击或者释放鼠标&#xff0c;键盘时&#xff0c;一个鼠标事件或者键盘事件就产生了。当窗口第一次显示时&#xff0c;一个绘制事件会产生告诉新可见的窗口绘…