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

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


一、JSON处理(encoding/json

1. 基本使用:结构体 <-> JSON

css 复制代码
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 -> 结构体

css 复制代码
jsonStr := `{"name":"Bob","age":25}`
var u User
err := json.Unmarshal([]byte(jsonStr), &u)
fmt.Printf("%+v\n", u)

3. 处理嵌套结构、数组、map

go 复制代码
type Post struct {
    ID     int
    Author User
    Tags   []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 文件

go 复制代码
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 文件

go 复制代码
file, _ := os.Open("data.csv")
defer file.Close()

reader := csv.NewReader(file)
records, _ := reader.ReadAll()
for _, record := range records {
    fmt.Println(record)
}

3. 自定义分隔符(如 ;

ini 复制代码
reader := csv.NewReader(file)
reader.Comma = ';'

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


三、XML处理(encoding/xml

1. 基本结构体标签

go 复制代码
type Note struct {
    To      string `xml:"to"`
    From    string `xml:"from"`
    Message string `xml:"message"`
}

2. 序列化:结构体 -> XML

go 复制代码
note := Note{"Tom", "Jerry", "Hello, XML!"}
data, _ := xml.MarshalIndent(note, "", "  ")
fmt.Println(xml.Header + string(data))

输出:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<Note>
  <to>Tom</to>
  <from>Jerry</from>
  <message>Hello, XML!</message>
</Note>

3. 反序列化:XML -> 结构体

swift 复制代码
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. 属性与嵌套结构

go 复制代码
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 时注意标签与命名空间。

相关推荐
leobertlan7 小时前
2025年终总结
前端·后端·程序员
面向Google编程7 小时前
从零学习Kafka:数据存储
后端·kafka
易安说AI8 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI8 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI8 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
颜酱10 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
掘金者阿豪13 小时前
关系数据库迁移的“暗礁”:金仓数据库如何规避数据完整性与一致性风险
后端
ServBay13 小时前
一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动
后端·php·symfony
sino爱学习13 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端