17 Go的文件操作

概述

在上一节的内容中,我们介绍了Go的反射,包括:reflect.TypeOf、reflect.ValueOf、reflect.Value等。在本节中,我们将介绍Go的文件操作。在Go语言中,文件是一个抽象的概念,表示的是一段连续的字节序列。文件操作主要包括:文件的创建、读取、写入、删除,以及目录的创建、删除、文件遍历等。Go语言提供了许多内置的函数和包,使得文件操作变得非常简单和高效。

读取文件

要读取文件,需要先打开文件。打开文件可以使用os.Open()函数,该函数返回一个*os.File类型的文件对象,表示已经打开的文件。要读取一个文件的内容,可以使用os包或bufio包提供的函数。

在下面的示例代码中,我们首先使用os.Open()函数打开了文件test.txt。然后,我们使用bufio.NewScanner函数创建了一个Scanner对象scanner,并逐行读取文件。如果文件读取时发生了错误,可通过scanner.Err()函数获取错误信息。

Go 复制代码
package main

import "os"
import "fmt"
import "bufio"

func main() {
    // 打开文件
    file, err := os.Open("test.txt")
    if err != nil {
        fmt.Println("Open failed: ", err)
        return
    }

    defer file.Close()

    // 逐行读取文件
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line := scanner.Text()
        // 处理每一行数据
        fmt.Println("line data: ", line)
    }

    if err := scanner.Err(); err != nil {
        // 处理读取错误
        fmt.Println("Read failed: ", err)
    }
}

写入文件

要写入文件,可以使用os包提供的Create()函数创建一个新文件,并使用Write()函数或WriteString()函数写入数据。

在下面的示例代码中,我们首先使用os.Create()函数创建了文件test.txt。然后,我们使用WriteString()函数写入了字符串"Hello, CSDN"。最后,我们通过defer语句关闭了文件,释放了系统资源。

Go 复制代码
package main

import "os"
import "fmt"

func main() {
    // 创建文件
    file, err := os.Create("test.txt")
    if err != nil {
        fmt.Println("Create failed: ", err)
        return
    }

    defer file.Close()

    text := "Hello, CSDN"
    // 向文件中写入字符串
    _, err = file.WriteString(text)
    if err != nil {
        fmt.Println("Write failed: ", err)
    }
}

在进行文件读写操作时,需要注意以下几点:

1、打开文件后,一定要记得关闭文件,以释放资源,可以使用defer语句来确保在函数结束时关闭文件。

2、在读取或写入文件时,需要检查是否有错误发生,并进行适当的错误处理。

删除文件

要删除一个文件,可以使用os.Remove()函数。

Go 复制代码
package main

import "os"
import "fmt"

func main() {
    err := os.Remove("test.txt")  
    if err != nil {
        fmt.Println("Remove failed:", err)
    } else {
        fmt.Println("Remove success")
    }
}

目录操作

目录的操作包括:创建目录、删除目录、判断目录是否存在等。

在下面的示例代码中,我们首先使用os.Mkdir()函数创建了一个名为test的新目录。第一个参数是目录的路径,第二个参数是目录的权限模式(0755表示拥有者具有读、写和执行权限,而组和其他用户具有读和执行权限)。接下来,我们通过os.Stat()函数判断目录是否存在。如果存在,则调用os.Remove()函数删除刚刚创建的目录。

Go 复制代码
package main

import "os"
import "fmt"

func main() {
    // 创建目录
    err := os.Mkdir("test", 0755)
    if err != nil {
        fmt.Println("Mkdir failed:", err)
        return
    } else {
        fmt.Println("Mkdir success")
    }

    // 判断目录是否存在
    _ , err2 := os.Stat("test")
    if err2 == nil {
        // 删除目录
        err = os.Remove("test")
        if err != nil {
            fmt.Println("Remove failed:", err)
        } else {
            fmt.Println("Remove success")
        }
    } else {
        fmt.Println("Path not exist")
    }
}

遍历目录下文件

在Go语言中,可以使用os包中的Readdir函数来读取目录的内容。Readdir函数返回一个[]os.DirEntry类型的切片,其中包含了目录中所有文件和子目录的信息。

在下面的示例代码中,我们使用os.Open函数打开名为doc的目录,并使用Readdir函数列出其中的所有文件。然后,通过遍历files切片,可以打印出每个文件的名称。注意:在使用Readdir函数时,传入-1作为参数将返回所有的文件,包括隐藏文件。

Go 复制代码
package main

import "os"
import "fmt"

func main() {
    // 打开目录
    dir, err := os.Open("doc")
    if err != nil {
        fmt.Println("Open failed:", err)
        return
    }

    defer dir.Close()

    // 读取目录
    files, err := dir.Readdir(-1)
    if err != nil {
        fmt.Println("Readdir failed:", err)
    } else {
        // 遍历目录下文件
        for _, file := range files {
            fmt.Println(file.Name())
        }
    }
}
相关推荐
资深web全栈开发5 小时前
并查集(Union-Find)套路详解
leetcode·golang·并查集·unionfind
moxiaoran57537 小时前
Go语言的递归函数
开发语言·后端·golang
朝花不迟暮7 小时前
Go基础-闭包
android·开发语言·golang
西京刀客9 小时前
go语言-切片排序之sort.Slice 和 sort.SliceStable 的区别(数据库分页、内存分页场景注意点)
后端·golang·sort·数据库分页·内存分页
黄昏单车10 小时前
golang语言基础到进阶学习笔记
笔记·golang·go
moxiaoran575319 小时前
Go语言结构体
开发语言·后端·golang
Tony Bai1 天前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
小徐Chao努力1 天前
Go语言核心知识点底层原理教程【变量、类型与常量】
开发语言·后端·golang
锥锋骚年1 天前
go语言异常处理方案
开发语言·后端·golang
moxiaoran57531 天前
Go语言的map
开发语言·后端·golang