当前位置: 首页 > news >正文

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!

相关文章:

  • PHP 项目搭建 ELK 日志监控体系完整指南
  • 第三方检测报告—科技成果鉴定测试
  • Ansible YAML 基础语法与关键词 的详细指南
  • 网络编程—TCP/IP模型(IP协议)
  • 若依系统弹窗父子页面传参数
  • 45.跳跃游戏 II
  • 网络编程—TCP/IP模型(数据链路层了解与知识补充)
  • DApp实战篇:前端技术栈一览
  • [ Redis ] | 初识Redis
  • 【数据结构】图的存储
  • ES使用聚合aggregations实战(自用:2025.04.07更新)
  • 铰链损失函数 Hinge Loss和Keras 实现
  • leetcode-代码随想录-哈希表-赎金信
  • Qt中的多种输出方式,信号与槽的基本使用
  • 场内期权和场外期权开户有什么区别?
  • 【学习笔记】Gymnasium入门(一)
  • 大模型:大模型部署Ollama和Dify
  • Python+AI提示词用贝叶斯样条回归拟合BSF方法分析樱花花期数据模型构建迹图、森林图可视化
  • 学透Spring Boot — 016. 魔术师 - Spring MVC Conversion Service 类型转换
  • SSL证书颁发机构有哪些呢
  • 做线上网站需要多少钱/百度网盘搜索神器
  • 网站开发和数据库的关系/网络媒体
  • asp做网站优点/百度关键词优化大师
  • 温州网站优化定制/百度一下的网址
  • phpcms 怎么做视频网站/企业培训计划
  • 广州做网络服装的网站建设/线下推广渠道和方式