Go语言中的文件与IO:文件读写

在实际开发中,文件操作是常见需求之一。Go 标准库提供了强大的 osiobufioioutil(已废弃,推荐使用 os/io) 等包,支持高效的文件读写。


一、打开与关闭文件

Go 使用 os.Openos.Create 等函数操作文件。

打开文件(只读):

go 复制代码
file, err := os.Open("test.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

创建文件(写入):

go 复制代码
file, err := os.Create("output.txt")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
  • os.Create:若文件已存在则清空内容;不存在则创建。
  • defer file.Close():确保函数退出时关闭文件,释放资源。

二、文件读取

1. 读取整个文件内容(os.ReadFile):

lua 复制代码
data, err := os.ReadFile("test.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(data))

2. 逐行读取(bufio.Scanner):

css 复制代码
file, _ := os.Open("test.txt")
defer file.Close()

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}
  • Scanner 适合按行读取大文件。
  • • 可以自定义分割符(如按词、段落等)。

3. 使用 Read 方法读取固定字节:

go 复制代码
buf := make([]byte, 100)
n, err := file.Read(buf)
fmt.Printf("Read %d bytes: %s\n", n, buf[:n])

三、文件写入

1. 写入字符串或字节(WriteString / Write):

css 复制代码
file, _ := os.Create("output.txt")
defer file.Close()

file.WriteString("Hello, Go!\n")
file.Write([]byte("Second line\n"))

2. 使用 bufio.Writer 缓冲写入:

css 复制代码
file, _ := os.Create("buffered.txt")
defer file.Close()

writer := bufio.NewWriter(file)
writer.WriteString("Buffered write\n")
writer.Flush() // 必须手动 flush

四、追加写入(os.OpenFile

如果想向文件追加内容,可使用如下方式:

lua 复制代码
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

css 复制代码
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

相关推荐
姑苏洛言2 小时前
编写产品需求文档:黄历日历小程序
前端·javascript·后端
姑苏洛言3 小时前
搭建一款结合传统黄历功能的日历小程序
前端·javascript·后端
你的人类朋友3 小时前
🍃认识一下boomi
后端
苏三说技术3 小时前
MySQL的三大日志
后端
豌豆花下猫3 小时前
让 Python 代码飙升330倍:从入门到精通的四种性能优化实践
后端·python·ai
南雨北斗4 小时前
TP6使用PHPMailer发送邮件
后端
你的人类朋友4 小时前
🤔什么时候用BFF架构?
前端·javascript·后端
争不过朝夕,又念着往昔5 小时前
Go语言反射机制详解
开发语言·后端·golang
绝无仅有6 小时前
企微审批对接错误与解决方案
后端·算法·架构
叹人间,美中不足今方信7 小时前
gRPC服务发现
rpc·go·服务发现