在Go中操作文件系统:初学者指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在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) }}


操作目录

博客

书籍推荐