在 Go 语言中,可以使用 bufio
包中的 Scanner
或 Reader
来逐行读取文件。以下是一些常见的方法:
- 使用
bufio.Scanner
:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
- 使用
bufio.Reader
和ReadString
:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n')
if err != nil {
break
}
fmt.Print(line)
}
}
- 使用
bufio.Reader
和ReadLine
:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
break
}
if isPrefix {
// 处理长行,可能需要多次调用 ReadLine
continue
}
fmt.Print(string(line))
}
}
注意,如果一行的长度超过了缓冲区的大小,ReadLine
会返回 isPrefix
为 true
,这时需要继续读取下一部分直到完整的行被读取。在实际应用中,可能需要循环调用 ReadLine
直到 isPrefix
为 false
。
以上方法都可以有效地逐行读取文件内容。选择哪种方法取决于具体的应用场景和性能要求。