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

相关推荐
该用户已不存在几秒前
7个没听过但绝对好用的工具
前端·后端
Java水解1 分钟前
KingbaseES SQL性能调优方案分享
后端·sql
用户4099322502122 分钟前
PostgreSQL连接的那些弯弯绕:笛卡尔积、外连接和LATERAL你都理明白没?
后端·ai编程·trae
oak隔壁找我3 分钟前
SpringBoot + MyBatis 配置详解
java·数据库·后端
爱分享的鱼鱼3 分钟前
技术方案文档案例——电商直播平台
后端
oak隔壁找我3 分钟前
SpringBoot + Redis 配置详解
java·数据库·后端
学习OK呀4 分钟前
java 有了Spring AI的扶持下
后端
canonical_entropy16 分钟前
最小变更成本 vs 最小信息表达:第一性原理的比较
后端
渣哥16 分钟前
代理选错,性能和功能全翻车!Spring AOP 的默认技术别再搞混
javascript·后端·面试
间彧32 分钟前
Java泛型详解与项目实战
后端