← Backend / Go / 基础专题

25_文件读写与路径

用标准库读写文本文件,处理路径和错误。

Go 基础专题 25:文件读写与路径

学习目标:用标准库读写文本文件,处理路径和错误。

核心知识

小文件可用 os.ReadFile 与 os.WriteFile;大文件逐行或分块读,避免一次加载全部内容。路径可用 filepath.Join 按目标系统拼接。相对路径以进程当前工作目录为基准,不一定以源码目录为基准。

package main

import (
    "fmt"
    "os"
)

func main() {
    if err := os.WriteFile("hello.txt", []byte("你好\n"), 0600); err != nil {
        fmt.Println("写入失败:", err)
        return
    }
    data, err := os.ReadFile("hello.txt")
    if err != nil {
        fmt.Println("读取失败:", err)
        return
    }
    fmt.Print(string(data))
}

权限参数 0600 表示新文件通常只允许所有者读写,实际结果仍受系统与 umask 影响。os.Create 会截断已有文件,使用前先确认是否允许覆盖。打开文件后用 defer file.Close(),对写入场景还应关注 Flush 和 Close 的错误。bufio.Scanner 默认有单个 token 大小限制,读取很长的行时可调整缓冲或使用 bufio.Reader。

文件不存在可通过 errors.Is(err, os.ErrNotExist) 判断。不要仅靠错误文本做分类,也不要忽略权限错误。

逐步理解

文件示例用 0600 创建权限较窄的新文件;若文件已存在,写入仍会覆盖内容,所以权限参数不等于“防覆盖”。先判断失败类型再决定提示:不存在可指导创建,权限不足需要检查路径或权限,其他 I/O 错误应保留原信息。读取大文件时逐块处理,避免一次性占用大量内存。

动手练习

练习:读取不存在的文件并输出友好消息。答案要点:先判断 err,再用 errors.Is 区分不存在与其他失败。