首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
Go语言核心36讲(Go语言基础知识一)--学习笔记
2
Go语言核心36讲(Go语言基础知识二)--学习笔记
3
Go语言核心36讲(Go语言基础知识三)--学习笔记
4
Go语言核心36讲(Go语言基础知识四)--学习笔记
5
Go语言核心36讲(Go语言基础知识五)--学习笔记
6
Go语言核心36讲(Go语言基础知识六)--学习笔记
7
Go语言核心36讲(Go语言进阶技术一)--学习笔记
8
Go语言核心36讲(Go语言进阶技术二)--学习笔记
9
Go语言核心36讲(Go语言进阶技术三)--学习笔记
10
Go语言核心36讲(Go语言进阶技术四)--学习笔记
11
Go语言核心36讲(Go语言进阶技术五)--学习笔记
12
Go语言核心36讲(Go语言进阶技术六)--学习笔记
13
Go语言核心36讲(Go语言进阶技术七)--学习笔记
14
Go语言核心36讲(Go语言进阶技术八)--学习笔记
15
Go语言核心36讲(Go语言进阶技术九)--学习笔记
16
Go语言核心36讲(Go语言进阶技术十)--学习笔记
17
Go语言核心36讲(Go语言进阶技术十一)--学习笔记
18
Go语言核心36讲(Go语言进阶技术十二)--学习笔记
19
Go语言核心36讲(Go语言进阶技术十三)--学习笔记
20
Go语言核心36讲(Go语言进阶技术十四)--学习笔记
21
Go语言核心36讲(Go语言进阶技术十五)--学习笔记
22
Go语言核心36讲(Go语言进阶技术十六)--学习笔记
23
Go语言核心36讲(Go语言实战与应用一)--学习笔记
24
Go语言核心36讲(Go语言实战与应用二)--学习笔记
25
Go语言核心36讲(Go语言实战与应用三)--学习笔记
26
Go语言核心36讲(Go语言实战与应用四)--学习笔记
27
Go语言核心36讲(Go语言实战与应用五)--学习笔记
28
Go语言核心36讲(Go语言实战与应用六)--学习笔记
29
Go语言核心36讲(Go语言实战与应用七)--学习笔记
30
Go语言核心36讲(Go语言实战与应用八)--学习笔记
31
Go语言核心36讲(Go语言实战与应用九)--学习笔记
32
Go语言核心36讲(Go语言实战与应用十)--学习笔记
33
Go语言核心36讲(Go语言实战与应用十一)--学习笔记
34
Go语言核心36讲(Go语言实战与应用十二)--学习笔记
35
Go语言核心36讲(Go语言实战与应用十三)--学习笔记
36
Go语言核心36讲(Go语言实战与应用十四)--学习笔记
37
Go语言核心36讲(Go语言实战与应用十五)--学习笔记
38
Go语言核心36讲(Go语言实战与应用十六)--学习笔记
39
Go语言核心36讲(Go语言实战与应用十七)--学习笔记
40
Go语言核心36讲(Go语言实战与应用十八)--学习笔记
41
Go语言核心36讲(Go语言实战与应用十九)--学习笔记
42
Go语言核心36讲(Go语言实战与应用二十)--学习笔记
43
Go语言核心36讲(Go语言实战与应用二十一)--学习笔记
44
Go语言核心36讲(Go语言实战与应用二十二)--学习笔记
45
Go语言核心36讲(Go语言实战与应用二十三)--学习笔记
46
Go语言核心36讲(Go语言实战与应用二十四)--学习笔记
47
Go语言核心36讲(Go语言实战与应用二十五)--学习笔记
48
Go语言核心36讲(Go语言实战与应用二十六)--学习笔记
49
Go语言核心36讲(Go语言实战与应用二十七)--学习笔记
50
Go读文件的几种姿势,你喜欢哪一种?

Go读文件的几种姿势,你喜欢哪一种?

读取文件是程序员日常工作中最常见的任务之一。您可以根据需要以不同的方式进行操作。在本教程中,我们告诉你如何一次读取整个文件、一行行读取、一字一句读取文件、以及分块去读。所有这些方法在 Go ? 中都非常简单。

读取整个文件

在 Go 中读取文本或二进制文件的最简单方法是使用os[1]包中的ReadFile()函数。此函数将文件的全部内容读到一个byte切片,因此在尝试读取大文件时应该注意 - 在这种情况下,您应该逐行分块读取文件。对于小文件,这种方式绰绰有余。

“如果您使用的是 1.16 之前的 Go 版本,您将ReadFile()`ioutil`[2]包中找到该功能。

代码语言:javascript
复制
package main

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

func main() {
    content, err := os.ReadFile("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(content))
}

输出:

代码语言:javascript
复制
Hello World!
This is txt file read by Go!

逐行读取文件

要逐行读取文件,我们可以使用比较方便的bufio.Scanner结构。它的构造函数NewScanner()接受一个打开的文件(记住在操作完成后关闭文件,例如通过 defer语句),并让您通过Scan()Text()方法读取后续行。使用Err()方法,您可以检查文件读取过程中遇到的错误。

代码语言:javascript
复制
package main

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

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    // read the file line by line using scanner
    scanner := bufio.NewScanner(f)

    for scanner.Scan() {
        // do something with a line
        fmt.Printf("line: %s\n", scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

输出:

代码语言:javascript
复制
line: Hello World!
line: This is txt file read by Go!

逐字的读取文件

逐字读取文件与逐行读取几乎相同。您只需要将Scannersplit功能从**默认的ScanLines()**函数更改为ScanWords()即可。

代码语言:javascript
复制
package main

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

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    // read the file word by word using scanner
    scanner := bufio.NewScanner(f)
    scanner.Split(bufio.ScanWords)

    for scanner.Scan() {
        // do something with a word
        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

输出:

代码语言:javascript
复制
Hello
World!
This
is
txt
file
read
by
Go!

分块读取文件

当你有一个非常大的文件或不想将整个文件存储在内存中时,您可以通过固定大小的块读取文件。在这种情况下,您需要创建一个指定大小chunkSize的byte切片作为缓冲区,用于存储后续读取的字节。使用Read()方法加载文件数据的下一个块。当发生io.EOF错误,指示文件结束,读取循环结束。

代码语言:javascript
复制
package main

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

const chunkSize = 10

func main() {
    // open file
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    // remember to close the file at the end of the program
    defer f.Close()

    buf := make([]byte, chunkSize)

    for {
        n, err := f.Read(buf)
        if err != nil && err != io.EOF {
            log.Fatal(err)
        }

        if err == io.EOF {
            break
        }

        fmt.Println(string(buf[:n]))
    }
}

输出:

代码语言:javascript
复制
Hello Worl
d!
This is
 txt file 
read by Go
!

参考资料

[1]

os: https://golang.org/pkg/os

[2]

ioutil: https://golang.org/pkg/io/ioutil

举报
领券