文件读写

Go 标准库用 osiobufio 处理文件。

一、读取整个文件

package main

import (
	"fmt"
	"os"
)

func main() {
	data, err := os.ReadFile("hello.txt")
	if err != nil {
		fmt.Println("读取失败:", err)
		return
	}

	fmt.Println(string(data))
}

os.ReadFile 适合读取小文件。

二、写入文件

data := []byte("Hello, Go")

err := os.WriteFile("hello.txt", data, 0644)
if err != nil {
	fmt.Println("写入失败:", err)
	return
}

0644 是文件权限:

  • 所有者可读写
  • 其他人只读

Windows 下权限概念不完全一样,但参数仍然需要传。

三、打开文件并关闭

file, err := os.Open("hello.txt")
if err != nil {
	return err
}
defer file.Close()

文件打开成功后,马上写 defer file.Close()

四、逐行读取

file, err := os.Open("hello.txt")
if err != nil {
	fmt.Println(err)
	return
}
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
	fmt.Println(scanner.Text())
}

if err := scanner.Err(); err != nil {
	fmt.Println("读取失败:", err)
}

逐行读取适合日志、配置等文本文件。

五、追加写入

file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
	fmt.Println(err)
	return
}
defer file.Close()

_, err = file.WriteString("hello\n")
if err != nil {
	fmt.Println(err)
}

参数说明:

参数作用
os.O_CREATE文件不存在就创建
os.O_WRONLY只写
os.O_APPEND追加到文件末尾

六、路径处理

使用 path/filepath 处理本地文件路径:

path := filepath.Join("data", "users.json")
fmt.Println(path)

不要手动拼接:

// 不推荐
// "data/users.json"

因为 Windows 和 Unix 系统路径分隔符不同。

七、文件是否存在

_, err := os.Stat("hello.txt")
if err == nil {
	fmt.Println("文件存在")
} else if os.IsNotExist(err) {
	fmt.Println("文件不存在")
} else {
	fmt.Println("其他错误:", err)
}

八、使用建议

  • 小文件可以用 os.ReadFile / os.WriteFile
  • 大文件用流式读取。
  • 打开文件后及时 defer Close()
  • 路径用 filepath.Join
  • 错误不要忽略。