这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。
- os 包提供了一个独立于平台的接口来执行操作级操作。
- IOutil 软件包提供了易于使用的实用程序函数来处理文件,而无需了解太多内部实现。
- bufio 包实现了缓冲 IO,这有助于我们提高输入和输出操作的性能和吞吐量。
-
log 包实现一个简单的日志记录包。我们将在整个程序中使用它。我们将在程序中使用日志包的
Fatal()
函数。
整个文件读取
我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用ioutil.ReadFile()
函数来读取文件并将文件的内容存储在一个变量中。
首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。
___ | |_ _ _ _ ilovego.txt | |_ _ _ _ main.go
我们在 main.go
函数中写入如下的内容:
package main import ( "fmt" "io/ioutil" "log" ) func main() { content, err := ioutil.ReadFile("ilovego.txt") if err != nil { log.Fatal(err) } fmt.Println(string(content)) }
但首先,让我们讨论一下 ReadFile()
函数的情况:
- 定义:方法声明 func
ReadFile(filename string) ([]byte, error)
- 功能:读取路径被传入函数参数的文件,并返回文件的内容。在内部使用
os.ReadFile(fileName)
方法 - 返回:在一个字节数组中返回文件的内容和错误。一个成功的调用将返回 err == nil
内部 ReadFile 函数实现如下:
func ReadFile(filename string) ([]byte, error) { return os.ReadFile(filename) }
现在,让我们回到我们的程序:
-
ioutil.ReadFile("readthisfile.txt")
返回一个 byteArray 和一个 err。我们将byteArray 存储在 "content "变量中,错误存储在 " err "变量中。 - 然后我们放置了一个 if 条件,如果 err 值不为 nil,我们将使用
log.Fatal()
函数打印错误 err 。记住,Fatal()
函数等同于Print()
函数,然后调用os.Exit(1)
。 - 最后,我们将使用
fmt.Println()
函数打印文件的内容。 我们不能简单地打印content
变量,因为它是一个字节数组,我们需要将它转换为字符串:string(content)
然后新建一个 ilovego.txt
文件,写入如下内容:
I Love Golang, This is One of the Best Languages on the World!
最后,执行上述代码,可以看到如下输出:
$ go run main.go I Love Golang, This is One of the Best Languages on the World!
按行读取
Scanner 扫描器提供了一个方便的接口来读取数据,比如一个由新行分隔的文本行组成的文件。它通过标记来读取数据;Split
函数定义了标记。默认情况下,该函数将数据分成几行,并剥离了行端。
package main import ( "fmt" // "io/ioutil" "bufio" "log" "os" ) func main() { // opening the file using Open function f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() // create a scanner for the file scanner := bufio.NewScanner(f) // loop through the scanner until it return fasle for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) } }
-
os.Open()
打开参数中传递的文件。如果在打开文件时遇到任何错误,它将返回同样的错误。否则,错误将是 nil。 - 然后,我们使用扫描器来读取文件,并逐行扫描,直到文件内容结束。
- 最后,我们要关闭该文件。
执行程序,结果如下:
逐个单词读取
我们还可以通过逐个单词来读取文件:
package main import ( "bufio" "fmt" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { fmt.Println(err) } defer f.Close() scanner := bufio.NewScanner(f) scanner.Split(bufio.ScanWords) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println(err) } }
运行代码:
$ go run main.go I Love Golang, This is One of the Best Languages on the World!
以数据块的形式读取文件
一次性读取整个文件似乎是一种简单的方法,但有时我们需要从内存管理的角度使我们的程序得到一些优化。Golang 提供了一种分块读取文件的方法,而不是整个或甚至逐行读取。因为如果一行的大小太大,逐行读取也可能是低效的。
package main import ( "bufio" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("ilovego.txt") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 16) for { // reading a file upto buffer n, err := reader.Read(buf) if err != nil { if err != io.EOF { log.Fatal(err) } break } fmt.Print(string(buf[0:n])) } fmt.Println() }
二进制读取
hex
包实现了十六进制的编码和解码。
package main import ( "bufio" "encoding/hex" "fmt" "io" "log" "os" ) func main() { f, err := os.Open("sid.jpg") if err != nil { log.Fatal(err) } defer f.Close() reader := bufio.NewReader(f) buf := make([]byte, 256) for { _, err := reader.Read(buf) if err != nil { if err != io.EOF { fmt.Println(err) } break } fmt.Printf("%s", hex.Dump(buf)) } }
总结
本文介绍了 Go 语言读取文件的几种方式,ioutil.ReadFile
函数将整个文件读成一个字符串。这个函数很方便,但不应该用于非常大的文件。希望能对你有所帮助!
推荐学习:Golang教程
以上是Go语言怎么读取文件?多种方式浅析的详细内容。更多信息请关注PHP中文网其他相关文章!

Interfaceand -polymormormormormormingingoenhancecodereusability and Maintainability.1)DewineInterfaceSattherightabStractractionLevel.2)useInterInterFacesForceFordEffeldIndentientIndoction.3)ProfileCodeTomanagePerformanceImpacts。

TheinitfunctioninGorunsautomaticallybeforethemainfunctiontoinitializepackagesandsetuptheenvironment.It'susefulforsettingupglobalvariables,resources,andperformingone-timesetuptasksacrossanypackage.Here'showitworks:1)Itcanbeusedinanypackage,notjusttheo

接口组合在Go编程中通过将功能分解为小型、专注的接口来构建复杂抽象。1)定义Reader、Writer和Closer接口。2)通过组合这些接口创建如File和NetworkStream的复杂类型。3)使用ProcessData函数展示如何处理这些组合接口。这种方法增强了代码的灵活性、可测试性和可重用性,但需注意避免过度碎片化和组合复杂性。

initfunctionsingoareAutomationalCalledBeLedBeForeTheMainFunctionandAreuseFulforSetupButcomeWithChallenges.1)executiondorder:totiernitFunctionSrunIndIndefinitionorder,cancancapationSifsUsiseSiftheyDepplothother.2)测试:sterfunctionsmunctionsmunctionsMayInterfionsMayInterferfereWithTests,b

本文讨论了GO中的数组和切片之间的差异,重点是尺寸,内存分配,功能传递和用法方案。阵列是固定尺寸的,分配的堆栈,而切片是动态的,通常是堆积的,并且更灵活。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Linux新版
SublimeText3 Linux最新版