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 时注意标签与命名空间。

相关推荐
Mintopia11 小时前
系统复杂度失控的根源:不是业务,而是边界
后端
穗余11 小时前
Rust——impl是什么意思
开发语言·后端·rust
代码羊羊11 小时前
Rust模式匹配
开发语言·后端·rust
IT_陈寒11 小时前
Python的GIL把我CPU跑满时我才明白并发不是这样玩的
前端·人工智能·后端
小江的记录本11 小时前
【分布式】分布式系统核心知识体系:CAP定理、BASE理论与核心挑战
java·前端·网络·分布式·后端·python·安全
一个public的class12 小时前
前后端 + Nginx + Gateway + K8s 全链路架构图解
前端·后端·nginx·kubernetes·gateway
callJJ12 小时前
SpringBoot 自动配置原理详解——从“约定优于配置“到源码全程追踪
java·spring boot·后端·spring
小江的记录本12 小时前
【分布式】分布式一致性协议:2PC/3PC、Paxos、Raft、ZAB 核心原理、区别(2026必考Raft)
java·前端·分布式·后端·安全·面试·系统架构
古方路杰出青年12 小时前
学习笔记1:Python FastAPI极简后端API示例解析
笔记·后端·python·学习·fastapi
喜欢流萤吖~14 小时前
微服务架构解析:从单体到分布式
spring boot·后端