我们可以使用GoLang的 "bufio"包和 "os "包来逐行读取一个文件的内容。

逐行读取一个文本文件的过程包括以下步骤:

  • 使用os.open()函数来打开文件。
  • 使用bufio.NewScanner()函数来创建文件扫描器。
  • 使用bufio.ScanLines()函数与扫描器一起将文件分割成行。
  • 然后在for循环中使用扫描器Scan()函数来获取每一行并进行处理。

下面是在GoLang中逐行读取文本文件并打印的完整代码。

package main

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

func main() {

	readFile, err := os.Open("data.txt")
 
	if err != nil {
		fmt.Println(err)
	}
	fileScanner := bufio.NewScanner(readFile)

	fileScanner.Split(bufio.ScanLines)
 
	for fileScanner.Scan() {
		fmt.Println(fileScanner.Text())
	}
 
	readFile.Close()
}

注意:data.txt文件应该和上述程序在同一个目录中,否则你会得到一个错误,打印为 "open data.txt: no such file or directory"。

逐行读取文件到字符串数组

上面的程序有两个问题:

  • 文本文件的路径是硬编码的,让我们从命令行参数中读取它。
  • 我们正在处理文件行,这使我们的资源保持较长的开放时间。我们可以将文件数据读入一个字符串数组,然后进行相应的处理。但对于一个非常大的文件,不建议这样做。

下面是更新后的代码,从命令行读取文件路径,并将其行数保存到一个字符串数组中。

package main

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

func main() {

	filePath := os.Args[1]
	readFile, err := os.Open(filePath)
 
	if err != nil {
		fmt.Println(err)
	}
	fileScanner := bufio.NewScanner(readFile)
	fileScanner.Split(bufio.ScanLines)
	var fileLines []string
 
	for fileScanner.Scan() {
		fileLines = append(fileLines, fileScanner.Text())
	}
 
	readFile.Close()
 
	for _, line := range fileLines {
		fmt.Println(line)
	}
	
	fmt.Println(fileLines)
}

我已将上述文件保存为 "read_file.go"。让我们看看如何从命令行中运行它。

 % go run read_file.go data.txt
Hello World
I love Go Programming
Bye Bye
[Hello World I love Go Programming Bye Bye]
% 

结论

在Go编程中读取文件是非常容易的。我们可以逐行读取文件内容并进行处理,也可以将其存储到一个字符串数组中并在以后进行处理。我们应该在工作完成后立即关闭文件资源。