这篇文章主要介绍“Go语言如何实现读取文件”,在日常操作中,相信很多人在Go语言如何实现读取文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言如何实现读取文件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
整个文件读取
我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用IoUtil.ReadFile()
函数来读取文件并将文件的内容存储在一个变量中。
首先,让我们在我们程序所在的同一目录下存储一个文件。因此,我们的文件夹结构将是下面这样的。
___
|
|_ _ _ _ ilovego.txt |
|_ _ _ _ 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)
内部 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)
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) } }
执行程序,结果如下:
逐个单词读取
我们还可以通过逐个单词来读取文件:
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语言如何实现读取文件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程之家网站,小编会继续努力为大家带来更多实用的文章!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。