在实际开发中,文件操作是常见需求之一。Go 标准库提供了强大的
os
、io
、bufio
和ioutil(已废弃,推荐使用 os/io)
等包,支持高效的文件读写。
一、打开与关闭文件
Go 使用 os.Open
和 os.Create
等函数操作文件。
打开文件(只读):
file, err := os.Open("test.txt")
if err != nil {log.Fatal(err)
}
defer file.Close()
创建文件(写入):
file, err := os.Create("output.txt")
if err != nil {log.Fatal(err)
}
defer file.Close()
- •
os.Create
:若文件已存在则清空内容;不存在则创建。 - •
defer file.Close()
:确保函数退出时关闭文件,释放资源。
二、文件读取
1. 读取整个文件内容(os.ReadFile
):
data, err := os.ReadFile("test.txt")
if err != nil {log.Fatal(err)
}
fmt.Println(string(data))
2. 逐行读取(bufio.Scanner
):
file, _ := os.Open("test.txt")
defer file.Close()scanner := bufio.NewScanner(file)
for scanner.Scan() {fmt.Println(scanner.Text())
}
- •
Scanner
适合按行读取大文件。 - • 可以自定义分割符(如按词、段落等)。
3. 使用 Read
方法读取固定字节:
buf := make([]byte, 100)
n, err := file.Read(buf)
fmt.Printf("Read %d bytes: %s\n", n, buf[:n])
三、文件写入
1. 写入字符串或字节(WriteString
/ Write
):
file, _ := os.Create("output.txt")
defer file.Close()file.WriteString("Hello, Go!\n")
file.Write([]byte("Second line\n"))
2. 使用 bufio.Writer
缓冲写入:
file, _ := os.Create("buffered.txt")
defer file.Close()writer := bufio.NewWriter(file)
writer.WriteString("Buffered write\n")
writer.Flush() // 必须手动 flush
四、追加写入(os.OpenFile
)
如果想向文件追加内容,可使用如下方式:
file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
defer file.Close()file.WriteString("New log entry\n")
- • 常见标志位:
- •
os.O_RDONLY
:只读 - •
os.O_WRONLY
:只写 - •
os.O_RDWR
:读写 - •
os.O_APPEND
:追加 - •
os.O_CREATE
:创建 - •
os.O_TRUNC
:清空原内容
- •
五、复制文件内容(使用 io.Copy
)
src, _ := os.Open("src.txt")
dst, _ := os.Create("dst.txt")
defer src.Close()
defer dst.Close()io.Copy(dst, src)
- •
io.Copy
是复制文件内容的简洁高效方式。
六、常见错误处理技巧
- • 一定要 关闭文件:使用
defer
。 - • 检查
err
:防止 panic。 - • 注意文件权限,UNIX 系统中建议使用
0644
。
七、小结
操作 | 推荐方式 |
读完整文件 | os.ReadFile |
按行读取 | bufio.Scanner |
写文件 | os.Create + Write / Writer |
追加写入 | os.OpenFile + O_APPEND |
拷贝文件 | io.Copy |