作为一种编程语言,Go 具有广泛的内置功能,包括创建、读取和写入文本(.txt)文件等文件的功能。 文件是现代世界我们日常生活的重要组成部分。文本文件对于存储结构化的人类可读数据非常有用,而无需使用外部软件或数据库。 如果您想知道如何开始在Go中操作文本文件,那么本文是适合您的地方。

Go 中的 bufio 包

bufio 包是 Go 标准库的一部分,用于缓冲输入和输出操作,因此得名。bufio 包基于 io.Reader 和 io.Writer 接口构建,它们广泛用于大多数 Go 标准包的实现。 bufio 包通过实现缓冲更进一步,使其对涉及文本数据的 IO 操作很有用。 要在您的程序中使用 bufio 包,您应该将它与其他包一起导入。

 

 

import (    "fmt"    "bufio")
  当您开始使用 Go 时,您可能听说过它包含作为程序员可能需要的一切。为了与您的操作系统直接通信,有一个名为 os 的包,它提供了与平台无关的功能。 os 和 bufio 包使文本文件操作变得异常简单。 尽管 os 包的绝大多数函数都是类 Unix 的,但它们都采用 Go 风格的错误处理,这使得阅读错误消息和调试代码变得简单。 那么,如何在Go中操作包含文本的文件呢?

 

如何从文本文件中读取数据

要从文本文件中读取数据,您需要调用 os 包的 Open() 函数,该函数接受要读取的文件名作为参数。获取文件的另一种方法是使用 OpenFile() 函数。 Open() 和 OpenFile() 之间的主要区别在于它们的实现。Open() 以只读模式打开文件(使用 O_RDONLY 标志),而 OpenFile() 通过接受三个参数来提供更大的灵活性,即:

文件名

文件打开模式:有效的文件打开模式如下表所示。

标志 含义
O_RDONLY 以只读模式打开文件
O_WRONLY 以只写模式打开文件
O_RDWR 以读写模式打开文件
O_APPEND 写入时将数据追加到文件
O_CREATE 创建新文件(如果不存在)
O_EXCL 与O_CREATE一起使用,以指示仅当文件不存在时才应创建该文件
O_SYNC 打开同步 I/O 的文件
O_TRUNC 如果可能,在打开时截断文件

文件权限:与 Linux 中用于指定文件访问规则的文件权限位相同,例如,0777 向所有用户类型授予读取、写入和执行权限。

下面的代码展示了如何使用 os.Open() 和 Scan() 从 Go 中的文本文件中读取数据, 在本例中,Scan() 在 Go for 循环中运行。

 

 

 

package mainimport (    "bufio"    "fmt"    "log"    "os")/**    CONTENT OF THE "linuxmi.txt" file.    lorem ipsum dolor sit amet    LOREM IPSUM DOLOR SIT AMET    Lorem ipsum dolor sit amet    Lorem Ipsum Dolor Sit Amet    lOREM iPSUM dOLOR sIT aMET    LoReM IpSuM DoLoR SiT AmEt*/func main() {    file, err := os.Open("linuxmi.txt")    // another method using os.OpenFile()    // file, err = os.OpenFile("linuxmi.txt", os.O_RDONLY, 0644)    if err != nil {        log.Fatal(err)    }    defer file.Close()    fmt.Println("File opened successfully. Now reading file contents line by line:")    // create scanner from the file to read text from    scanner := bufio.NewScanner(file)    // scan or read the bytes of text line by line    for scanner.Scan() {        fmt.Println(scanner.Text())    }    if err := scanner.Err(); err != nil {        log.Fatal(err)    }}

 

运行上面的代码,它会产生如下所示的输出:

从文件中读取文本的程序输出

如果你只传入文件名而不是 Open() 或 OpenFile() 函数的路径以进行读取操作,Go 会假定文件在当前目录中,如果找不到则返回错误。如果您需要处理当前目录之外的文件,您应该传入文件的路径。

如何将数据写入文本文件

bufio 包提供了一个缓冲的 Writer 接口,该接口存储数据字节并在 Flush() 函数的帮助下将它们写入文件。

下一个示例代码是读取文件的延续。在此示例中,使用 O_WRONLY 和 O_APPEND 标志将数据写入现有的 linuxmi.txt。

将以下代码行添加到上面的程序中,在 main() 函数的右花括号之前:

 

 

 

  // 将输出数据写入文件  file, err = os.OpenFile("linuxmi.txt", os.O_APPEND|os.O_WRONLY, 0644)  if err != nil {    log.Fatal(err)  }  defer file.Close()  fmt.Println("文件打开成功,正在准备将数据写入文件...")  // 创建缓冲的 Writer 对象以将数据写入文件  textWriter := bufio.NewWriter(file)  // 在保存文件之前将字符串写入缓冲区。  _, err = textWriter.WriteString("-这是添加到文件中的新文本。")  if err != nil {    log.Fatal(err)  }  textWriter.Flush()  fmt.Println("数据写入文件成功...")

 

完整程序的输出应如下所示:

程序的输出以读取和写入文本文件

当您打开 linuxmi.txt 文件时,您还将看到文件末尾附加的新行,如下图所示:

Go 中的文件处理非常简单

Go 允许您处理各种文件,而不仅仅是文本文件。有许多额外的内置库和函数用于处理来自文件的不同类型的数据,包括 JSON 和 CSV。

要查看它们在不同情况下的行为方式有何不同,您可以尝试可用于 OpenFile() 的各种标志和文件权限。