在Go中操作文件系统:初学者指南
Go (Golang) 是一种现代编译型语言,以其简洁性、高性能和内置工具而闻名。任何后端开发人员的核心任务之一就是与文件系统交互:读取配置、写入日志、创建临时文件和目录。在本文中,我们将从最基础的知识开始,讲解Go中文件和目录的基本操作。本材料面向初学者,因此每一步都将附带清晰的代码示例。
用于文件操作的主要包
Go标准库中有两个用于文件系统操作的主要包:
os— 用于文件、文件夹、访问权限和进程的低级操作。io/ioutil(在Go 1.16中已弃用,但仍可见) — 用于一次性读取/写入整个文件的便捷函数。io— 用于流式输入/输出的接口。bufio— 缓冲读写(对于大文件很有用)。
从Go 1.16开始,建议使用os包中的函数(os.ReadFile、os.WriteFile)而不是ioutil。我们将采用现代方法。
读取文件
一次性读取小文件的最简单方法是使用os.ReadFile。它返回一个字节切片和一个错误。
package main
import ( "fmt" "os")
func main() { // 一次性读取整个文件 data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("读取文件错误:", err) return } fmt.Println("文件内容:") fmt.Println(string(data))}如果文件很大(例如,数百兆字节的日志文件),最好使用bufio.Scanner逐行或分块读取:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("bigfile.log") if err != nil { fmt.Println("打开文件错误:", err) return } defer file.Close() // 务必关闭文件
scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() fmt.Println(line) // 处理行 }
if err := scanner.Err(); err != nil { fmt.Println("扫描错误:", err) }}请注意defer file.Close() — 这确保即使在发生错误时,函数结束后文件也会被关闭。
写入文件
要将数据写入文件,请使用os.WriteFile(创建/覆盖文件)或os.Create + Write(用于更灵活的写入)。
package main
import ( "fmt" "os")
func main() { // 简单地将字符串写入文件 text := "你好,世界!第二行。" err := os.WriteFile("output.txt", []byte(text), 0644) if err != nil { fmt.Println("写入错误:", err) return } fmt.Println("文件写入成功")}参数0644是Unix风格的访问权限(所有者可以读/写,其他人只能读)。
如果需要将数据追加到文件末尾,请使用带有os.O_APPEND标志的os.OpenFile:
package main
import ( "fmt" "os")
func main() { file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Println("打开文件错误:", err) return } defer file.Close()
_, err = file.WriteString("新的日志条目") if err != nil { fmt.Println("写入错误:", err) }}