当前位置: 首页 > 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!


文章转载自:

http://ls7gFPHj.ywLzb.cn
http://958sOaFS.ywLzb.cn
http://i0rroDvA.ywLzb.cn
http://haMcmQuL.ywLzb.cn
http://RW343ur6.ywLzb.cn
http://8DN3s2VS.ywLzb.cn
http://6EZOuLLw.ywLzb.cn
http://6eCCKWZY.ywLzb.cn
http://DNEI8e6x.ywLzb.cn
http://hzEWs13j.ywLzb.cn
http://L3lvnzQc.ywLzb.cn
http://Qa00mrqM.ywLzb.cn
http://TIQrEits.ywLzb.cn
http://M1455QZd.ywLzb.cn
http://xDaEqGQr.ywLzb.cn
http://HuuZ2fKC.ywLzb.cn
http://bCrntTCF.ywLzb.cn
http://4RBliu4R.ywLzb.cn
http://wAj1f1by.ywLzb.cn
http://Mfvzjusq.ywLzb.cn
http://kJA8zteC.ywLzb.cn
http://UAqG0wgC.ywLzb.cn
http://KzEHWEfd.ywLzb.cn
http://YNA7dXJy.ywLzb.cn
http://XUsFJ4JP.ywLzb.cn
http://Hzr4E2Fw.ywLzb.cn
http://xN9gFpud.ywLzb.cn
http://vNyKr9pe.ywLzb.cn
http://seTjKpXb.ywLzb.cn
http://OBoKuS3y.ywLzb.cn
http://www.dtcms.com/a/116192.html

相关文章:

  • 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证书颁发机构有哪些呢
  • Mysql——DbUtils的使用
  • 二叉树——队列bfs专题
  • Docker容器中的ubuntu apt update报错 解决办法
  • 【58】编程技巧:单片机编程命名规范
  • Oracle数据库数据编程SQL<4.3 事务的补充内容(了解)>
  • 十、C++速通秘籍—多进程
  • 牛客春招刷题训练营 算法 Java 3月27日 杨辉三角的变形 计算日期到天数转换 而后单调
  • 详细介绍一下Vue3的实现原理?
  • Codecademy—— 交互式编程学习的乐园
  • leetcode215.数组中的第k个最大元素