Go语言文件系统操作:实战指南

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

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

开始课程

Go语言文件系统操作:实战指南

\n\n

文件系统操作是任何服务器应用程序的基础任务之一。Go语言(Golang)提供了强大而优雅的工具集,用于读取、写入、删除和管理文件与目录。在本文中,我们将使用标准包os、io/ioutil(Go 1.16之前)和io,通过实际示例来解析Go语言中的文件操作。您将学习如何高效管理磁盘数据、处理错误以及编写简洁的代码。

\n\n

1. 基础:文件的打开、读取与写入

\n\n

我们从最常见的操作开始。打开文件使用os.OpenFile函数,或者更简单的封装os.Create和os.Open。来看一个将整个文件读入内存的示例:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // 读取整个文件(Go 1.16之前使用ioutil.ReadFile)\n    data, err := os.ReadFile("example.txt")\n    if err != nil {\n        fmt.Println("读取文件错误:", err)\n        return\n    }\n    fmt.Println("文件内容:")\n    fmt.Println(string(data))\n}\n
\n\n

要向文件写入数据,请使用os.WriteFile:

\n\n
package main\n\nimport (\n    "os"\n)\n\nfunc main() {\n    content := []byte("你好,Go世界!\\n第二行。")\n    err := os.WriteFile("output.txt", content, 0644)\n    if err != nil {\n        panic(err)\n    }\n    // output.txt文件已创建并包含我们的文本\n}\n
\n\n

如果您需要将数据追加到文件末尾,请使用标志:

\n\n
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)\nif err != nil {\n    panic(err)\n}\ndefer file.Close()\n\nif _, err := file.WriteString("新的日志记录\\n"); err != nil {\n    panic(err)\n}\n
\n\n

2. 目录操作:创建、删除与遍历

\n\n

文件夹管理同样重要。可以使用os.Mkdir(单个文件夹)或os.MkdirAll(递归创建,类似mkdir -p)创建新目录:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // 创建一个文件夹\n    err := os.Mkdir("data", 0755)\n    if err != nil {\n        fmt.Println("创建文件夹错误:", err)\n    }\n\n    // 递归创建嵌套结构\n    err = os.MkdirAll("data/subdir/logs", 0755)\n    if err != nil {\n        fmt.Println("错误:", err)\n    }\n}\n
\n\n

要遍历目录,可以使用os.ReadDir函数(替代ioutil.ReadDir):

\n\n
entries, err := os.ReadDir(".")\nif err != nil {\n    panic(err)\n}\n\nfor _, entry := range entries {\n    fmt.Printf("名称: %s, 文件夹: %t\\n", entry.Name(), entry.IsDir())\n}\n
\n\n

要递归遍历所有文件和文件夹,请使用path/filepath包中的filepath.Walk:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n)\n\nfunc main() {\n    err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n        fmt.Println(path)\n        return nil\n    })\n    if err != nil {\n        fmt.Println("遍历错误:", err)\n    }\n}\n
\n\n

删除文件和文件夹使用os.Remove和os.RemoveAll函数:

\n\n
// 删除单个文件或空文件夹\nos.Remove("temp.txt")\n\n// 删除文件夹及其所有内容(类似rm -rf)\nos.RemoveAll("data")\n
\n\n

3. 高级技巧:缓冲输入/输出与临时文件操作

\n\n

对于大文件,将全部内容读入内存效率不高。请使用bufio进行缓冲读取:

\n\n
package main\n\nimport (\n    "bufio"\n    "                

博客

书籍推荐