go语言读写文件

举报
福州司马懿 发表于 2025/05/26 09:51:13 2025/05/26
【摘要】 Go语言提供了简单而强大的文件I/O操作功能,主要通过os和io/ioutil(Go 1.16+推荐使用os和io包)标准库实现。以下是Go语言中文件读写的基本操作: 读取文件 1. 读取整个文件import ( "fmt" "os")func main() { // 读取整个文件内容 content, err := os.ReadFile("example.txt"...

Go语言提供了简单而强大的文件I/O操作功能,主要通过osio/ioutil(Go 1.16+推荐使用osio包)标准库实现。以下是Go语言中文件读写的基本操作:

读取文件

1. 读取整个文件

import (
    "fmt"
    "os"
)

func main() {
    // 读取整个文件内容
    content, err := os.ReadFile("example.txt")
    if err != nil {
        panic(err)
    }
    
    fmt.Println(string(content))
}

2. 逐行读取文件

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    // 打开文件
    file, err := os.Open("example.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close() // 确保文件关闭
    
    // 创建Scanner逐行读取
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    
    if err := scanner.Err(); err != nil {
        panic(err)
    }
}

3. 使用bufio.Reader读取

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("example.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    reader := bufio.NewReader(file)
    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            break // 到达文件末尾或出错
        }
        fmt.Print(line)
    }
}

写入文件

1. 写入整个文件

import (
    "os"
)

func main() {
    content := []byte("Hello, Go!\nThis is a file writing example.")
    
    // 写入文件(覆盖模式)
    err := os.WriteFile("output.txt", content, 0644)
    if err != nil {
        panic(err)
    }
}

2. 追加内容到文件

import (
    "os"
)

func main() {
    // 以追加模式打开文件
    f, err := os.OpenFile("output.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        panic(err)
    }
    defer f.Close()
    
    if _, err := f.WriteString("This line is appended.\n"); err != nil {
        panic(err)
    }
}

3. 使用bufio.Writer写入

import (
    "bufio"
    "os"
)

func main() {
    file, err := os.Create("output.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    writer := bufio.NewWriter(file)
    _, err = writer.WriteString("Hello, Go!\n")
    if err != nil {
        panic(err)
    }
    
    // 确保所有缓冲数据写入底层io.Writer
    writer.Flush()
}

高级文件操作

1. 检查文件是否存在

import (
    "os"
)

func fileExists(filename string) bool {
    info, err := os.Stat(filename)
    if os.IsNotExist(err) {
        return false
    }
    return !info.IsDir()
}

2. 复制文件

import (
    "io"
    "os"
)

func copyFile(src, dst string) error {
    source, err := os.Open(src)
    if err != nil {
        return err
    }
    defer source.Close()
    
    destination, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer destination.Close()
    
    _, err = io.Copy(destination, source)
    return err
}

3. 读取大文件(分块读取)

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("largefile.dat")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    buffer := make([]byte, 1024*1024) // 1MB缓冲区
    for {
        n, err := file.Read(buffer)
        if err != nil {
            if err.Error() != "EOF" {
                panic(err)
            }
            break
        }
        // 处理读取的数据
        fmt.Printf("Read %d bytes\n", n)
    }
}

注意事项

  1. 总是检查错误并适当处理
  2. 使用defer确保文件关闭
  3. 对于大文件,使用缓冲读取/写入
  4. 注意文件权限(0644等)
  5. 在Windows和Unix系统上注意路径分隔符的差异

这些基本操作涵盖了Go语言中文件I/O的主要用例,可以根据具体需求进行调整和扩展。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。