• 技术文章 >后端开发 >Golang

    Go语言怎么读取文件?多种方式浅析

    青灯夜游青灯夜游2023-04-20 18:28:45转载142

    这篇文章将讨论如何在 Golang 中读取文件。我们将使用以下包来处理这些文件。

    整个文件读取

    我们可以很容易地一次性读取整个文件并将其存储在一个变量中。但请记住,我们不应该对大文件这样做。我们将使用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() 函数的情况:

    内部 ReadFile 函数实现如下:

    func ReadFile(filename string) ([]byte, error) {
        return os.ReadFile(filename)
    }

    现在,让我们回到我们的程序:

    然后新建一个 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)
    	}
    }

    执行程序,结果如下:

    image.png

    逐个单词读取

    我们还可以通过逐个单词来读取文件:

    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中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:go语言 Golang
    上一篇:浅析Go语言的切片是如何扩容 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • golang怎么实现队列• 如何修改和优化Golang源代码• 如何配置docker gogs• win10中出现logonui.exe系统错误怎么解决• 54岁NLP顶级专家、耶鲁大学计算机教授Dragomir Radev去世,华人学生纷纷悼念• Apple 详细介绍了 Google Workspace 将如何与 Apple 商务管理集成• 如何将 Google Doc 文件转换为 MS Word 文件,反之亦然
    1/1

    PHP中文网