Go语言-初学者日记(五):文件操作与 JSON 实战
在日常开发中,处理文件与 JSON 是不可或缺的技能。本篇将带你玩转文件读写、JSON 编解码,并构建一个迷你命令行小工具 🚀
📄 一、文件读写基本操作(os & ioutil)
📥 读取文件(推荐用法)
content, err := os.ReadFile("data.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(content))
🧙 传统方式(更灵活控制):
f, err := os.Open("data.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
buf := make([]byte, 100)
n, _ := f.Read(buf)
fmt.Println(string(buf[:n]))
📤 写入文件(快速)
err := os.WriteFile("output.txt", []byte("Hello, file!"), 0644)
✍️ 创建并写入(可追加写日志)
f, _ := os.Create("log.txt")
f.Write([]byte("第一行日志
"))
f.Close()
📌 判断文件是否存在:
if _, err := os.Stat("data.txt"); os.IsNotExist(err) {
fmt.Println("文件不存在")
}
🧾 二、JSON 编解码(encoding/json)
✅ JSON -> Struct(反序列化)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
jsonStr := `{"name": "Alice", "age": 18}`
var u User
json.Unmarshal([]byte(jsonStr), &u)
fmt.Println(u.Name, u.Age)
⚠️ 注意:
- 字段首字母必须大写(导出字段)
- 使用
json:"字段名"
控制映射关系
✅ Struct -> JSON(序列化)
u := User{Name: "Bob", Age: 22}
b, _ := json.Marshal(u)
fmt.Println(string(b)) // {"name":"Bob","age":22}
🎨 美化 JSON 输出
b, _ := json.MarshalIndent(u, "", " ")
fmt.Println(string(b))
🧰 三、构建一个简单命令行工具(实用!)
目标:读取 JSON 文件并解析成用户信息列表
示例结构体:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
主程序:
func main() {
if len(os.Args) < 2 {
fmt.Println("请提供 JSON 文件路径")
return
}
file := os.Args[1]
data, err := os.ReadFile(file)
if err != nil {
log.Fatal(err)
}
var users []User
if err := json.Unmarshal(data, &users); err != nil {
log.Fatal(err)
}
for _, u := range users {
fmt.Printf("姓名:%s,年龄:%d
", u.Name, u.Age)
}
}
命令行运行:
go run main.go users.json
配套 JSON 文件 users.json
:
[
{ "name": "Alice", "age": 20 },
{ "name": "Bob", "age": 25 }
]
📌 小结
- ✅ 学会使用
os
包完成基本文件操作 - ✅ 掌握
encoding/json
包完成结构体与 JSON 的转换 - ✅ 结合
os.Args
实现简洁命令行程序 - ✅ 加一把输出美化技能,轻松打日志也不怕
📚 推荐练习
- 写一个程序将 JSON 用户列表写入 CSV 文件
- 编写文件合并工具:读取多个 txt 文件合并写出到一个新文件
- 练习使用
os.Args
构造命令行工具选项(例如-pretty
)
🏁 下一篇预告
👉 Go语言-初学者日记(六):Go 并发编程,从 goroutine 到 channel!