Go基础:理解 Reading Files, Writing Files, Line Filters in Go

让我们深入探索名为“阅读文件、写入文件、Go 中的行过滤器”的令人兴奋的文件操作世界。

full lessons here👇:
https://programmerscareer.com/zh-cn/golang-basic-skill/

由AI生成,可能有错误,仅供参考

1.1 Go 文件操作简介

Go 是一门简单高效的语言,它对文件操作也具有相似的特点。Go 提供了多个包,例如“os”包,可以执行各种文件操作,这些操作包括文件创建、读写文件等。需要注意的是,这些操作通常需要正确地处理错误,以管理潜在的问题。

Go 是一门非常适合与文件进行交互的语言,因为它对输入/输出操作的支持非常强。例如,让我们来看一下如何在 Go 中打开一个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"fmt"
"log"
"os"
)

func main() {
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println("Success! The file was opened.")
}

在这个示例中,我们尝试打开一个名为“test.txt”的文件。os.Open 函数尝试打开文件并返回两个值:文件指针和错误变量。然后,我们检查是否存在打开文件时的错误。如果存在错误,我们使用 log.Fatal 输出错误消息并停止程序。

1.2 Go 读取文件

Go 提供了多种方法来读取文件,例如 osioutil 包。下面是一些常见的方法:

  1. ioutil.Readfile:这是一个简单的方法,可以一次性读取整个文件。它需要最少的代码,使其实现起来非常简单。
1
2
3
4
5
6
content, err := ioutil.ReadFile("test.txt")
if err != nil {
log.Fatal(err)
}

fmt.Printf("File contents: %s", content)
  1. os.File.Read:这个方法允许您控制要读取文件的部分,这对于大文件来说非常有用。
1
2
3
4
5
6
7
8
9
10
11
12
13
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}

data := make([]byte, 64)

for {
_, err = file.Read(data)
if err != nil {
break
}
}
  1. bufio.Scanner:这个方法可以帮助您读取文件的每一行。
1
2
3
4
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}

1.3 Go 文件写入

Go 提供了多种方法来写入文件,例如 osbufio 包。下面是一些常见的方法:

  1. os.File.Write:这个方法可以将数据写入文件。
1
2
3
4
5
6
7
8
9
file, err := os.Create("test.txt")
if err != nil {
log.Fatal(err)
}

_, err = file.WriteString("Hello, World!")
if err != nil {
log.Fatal(err)
}
  1. bufio.Writer:这个方法可以帮助您将数据写入文件。
1
2
3
writer := bufio.NewWriter(file)
writer.WriteString("Buffered writer test line one\n")
writer.Flush()

1.4 Go 文件错误处理

在工作中,文件操作总是伴随着错误的存在。文件可能不存在、无法打开、权限不足等原因都可能会出现错误。因此,在执行文件操作时,需要有一个robust 的错误处理机制。

Go 中,错误是值,可以像其他类型一样对待。错误是函数和方法返回的结果,我们通常检查函数返回的错误。如果存在错误,我们可以使用 log.Fatal 输出错误消息并停止程序。

例如,让我们来看一下如何在 Go 中打开一个文件时处理错误:

1
2
3
4
5
6
file, err := os.Open("non_existent_file.txt")
if err != nil {
log.Fatalf("failed opening file: %s", err)
}

defer file.Close()

在这个示例中,如果文件“non_existent_file.txt”不存在,os.Open 将返回一个错误,我们捕捉并输出错误消息。

Topic: 1.5 Line Filters 的介绍

Line filters 是 UNIX 中的一种常见的程序。它们从标准输入读取数据,处理它,然后将结果发送到标准输出。

在 Go 中,这可以轻松地设置使用 os.Stdinbufio 包。下面是一个简单的 line filter 示例:

1
2
3
4
5
6
7
8
9
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
ucl := strings.ToUpper(scanner.Text())
fmt.Println(ucl)
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}

这个程序将标准输入转换为大写字母。我们创建一个新的 Scanner(在前面的课程中介绍过),它将默认扫描标准输入。

我们使用循环来 Scan(),这将给我们每一行文本输入。对于每一行被扫描,我们将其转换为大写字母,并将其打印出来。fmt.Println 将自动添加一个换行符(\n)。

如果在扫描过程中出现任何错误,我们将捕捉它们并将其打印到 os.Stderr,然后退出程序并返回状态码 1。

要测试它,请运行这个程序,并输入一些文本,查看程序输出的结果是大写字母。

Topic: 1.6 使用 Golang 构建 Line Filters

太好了,让我们更深入地探讨如何使用 bufio 包在 Go 中构建强大的 line filters,以便对每一行数据进行分离和处理。

Line filters 本质上是一种程序,它们从标准输入读取数据,按行处理,然后将结果发送到标准输出。

让我们编写一个将输入转换为小写字母的 line filter。Go 提供了在整个字符串中将其转换为小写或大写的便捷函数,在其 strings 包中。

一旦设置了扫描器,代码将遵循线程 filter 程序的模式。

下面是一个将输入转换为小写字母的 line filter 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

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

func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := strings.ToLower(scanner.Text())
fmt.Println(line)
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}
}

这个 line filter 从标准输入读取数据,将其转换为小写字母,然后将结果发送到标准输出。

运行它,并注意它将将所有输入文本从标准输入转换为小写字母。尝试输入一些文本!

记住,Go 的 bufio 包提供了创建强大、可靠的 line filters 的所有工具,可以处理数据效率高地读取和写入每一行。

Topic: 1.7 实践练习

这些练习与 Go 中的文件读写相关。

Review Topics:

我们讨论了文件操作,如读写到文件,然后讨论了使用 bufio 包在 Go 中构建 line filters,这允许我们对标准输入和输出进行数据处理。

Assessment:

理论问题:

  1. a) 什么是 line filter,何时有用?
  2. b) 哪个 Go 包帮助我们创建 line filters,并从中使用哪些函数?
  3. c) 如何在 Go 中处理文件操作中的错误?

实践问题:

  1. a) 写一个将输入文本转换为 Pig Latin 的 line filter。
  2. b) 写一个 Go 程序,它读取 CSV 文件,读取数据,然后将其写入到新的 CSV 文件中,以反向顺序。
  3. c) 写一个 Go 程序,它读取文本文件,并计算每个单词在文本文件中的出现次数。

我鼓励你花些时间来完成这些问题。

English post: https://programmerscareer.com/go-basic-08/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

Go基础:了解Go中的排序,文本模板,正则表达式,JSON, XML Go基础:了解 Goroutines, Channels, Select, Timeouts in Go

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×