最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言實(shí)現(xiàn)讀取文件的方式總結(jié)

 更新時(shí)間:2023年04月06日 11:36:50   作者:宇宙之一粟  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)讀取文件的幾個(gè)方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,感興趣的小伙伴可以收藏一下

前言

這篇文章將討論如何在 Golang 中讀取文件。我們將使用以下包來(lái)處理這些文件。

  • os 包提供了一個(gè)獨(dú)立于平臺(tái)的接口來(lái)執(zhí)行操作級(jí)操作。
  • IOutil 軟件包提供了易于使用的實(shí)用程序函數(shù)來(lái)處理文件,而無(wú)需了解太多內(nèi)部實(shí)現(xiàn)。
  • bufio 包實(shí)現(xiàn)了緩沖 IO,這有助于我們提高輸入和輸出操作的性能和吞吐量。
  • log 包實(shí)現(xiàn)一個(gè)簡(jiǎn)單的日志記錄包。我們將在整個(gè)程序中使用它。我們將在程序中使用日志包的 Fatal() 函數(shù)。

整個(gè)文件讀取

我們可以很容易地一次性讀取整個(gè)文件并將其存儲(chǔ)在一個(gè)變量中。但請(qǐng)記住,我們不應(yīng)該對(duì)大文件這樣做。我們將使用ioutil.ReadFile() 函數(shù)來(lái)讀取文件并將文件的內(nèi)容存儲(chǔ)在一個(gè)變量中。

首先,讓我們?cè)谖覀兂绦蛩诘耐荒夸浵麓鎯?chǔ)一個(gè)文件。因此,我們的文件夾結(jié)構(gòu)將是下面這樣的。

___ 

|_ _ _ _ ilovego.txt | 
|_ _ _ _ main.go

我們?cè)?main.go 函數(shù)中寫(xiě)入如下的內(nèi)容:

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() 函數(shù)的情況:

  • 定義:方法聲明 func ReadFile(filename string) ([]byte, error)
  • 功能:讀取路徑被傳入函數(shù)參數(shù)的文件,并返回文件的內(nèi)容。在內(nèi)部使用 os.ReadFile(fileName) 方法
  • 返回:在一個(gè)字節(jié)數(shù)組中返回文件的內(nèi)容和錯(cuò)誤。一個(gè)成功的調(diào)用將返回 err == nil

內(nèi)部 ReadFile 函數(shù)實(shí)現(xiàn)如下:

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

現(xiàn)在,讓我們回到我們的程序:

  • ioutil.ReadFile("readthisfile.txt") 返回一個(gè) byteArray 和一個(gè) err。我們將byteArray 存儲(chǔ)在 "content "變量中,錯(cuò)誤存儲(chǔ)在 " err "變量中。
  • 然后我們放置了一個(gè) if 條件,如果 err 值不為 nil,我們將使用 log.Fatal() 函數(shù)打印錯(cuò)誤 err 。記住,Fatal() 函數(shù)等同于 Print() 函數(shù),然后調(diào)用 os.Exit(1) 。
  • 最后,我們將使用 fmt.Println() 函數(shù)打印文件的內(nèi)容。 我們不能簡(jiǎn)單地打印 content 變量,因?yàn)樗且粋€(gè)字節(jié)數(shù)組,我們需要將它轉(zhuǎn)換為字符串: string(content)

然后新建一個(gè) ilovego.txt 文件,寫(xiě)入如下內(nèi)容:

I Love Golang,
This is One of the Best Languages on the World!

最后,執(zhí)行上述代碼,可以看到如下輸出:

$ go run main.go
I Love Golang, 
This is One of the Best Languages on the World!

按行讀取

Scanner 掃描器提供了一個(gè)方便的接口來(lái)讀取數(shù)據(jù),比如一個(gè)由新行分隔的文本行組成的文件。它通過(guò)標(biāo)記來(lái)讀取數(shù)據(jù);Split 函數(shù)定義了標(biāo)記。默認(rèn)情況下,該函數(shù)將數(shù)據(jù)分成幾行,并剝離了行端。

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() 打開(kāi)參數(shù)中傳遞的文件。如果在打開(kāi)文件時(shí)遇到任何錯(cuò)誤,它將返回同樣的錯(cuò)誤。否則,錯(cuò)誤將是 nil。
  • 然后,我們使用掃描器來(lái)讀取文件,并逐行掃描,直到文件內(nèi)容結(jié)束。
  • 最后,我們要關(guān)閉該文件。

執(zhí)行程序,結(jié)果如下:

逐個(gè)單詞讀取

我們還可以通過(guò)逐個(gè)單詞來(lái)讀取文件:

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)
	}
}

運(yùn)行代碼:

$ go run main.go
I
Love
Golang,
This
is
One
of
the
Best
Languages
on
the
World!

以數(shù)據(jù)塊的形式讀取文件

一次性讀取整個(gè)文件似乎是一種簡(jiǎn)單的方法,但有時(shí)我們需要從內(nèi)存管理的角度使我們的程序得到一些優(yōu)化。Golang 提供了一種分塊讀取文件的方法,而不是整個(gè)或甚至逐行讀取。因?yàn)槿绻恍械拇笮√?,逐行讀取也可能是低效的。

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()
}

二進(jìn)制讀取

hex 包實(shí)現(xiàn)了十六進(jìn)制的編碼和解碼。

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))
	}
}

總結(jié)

本文介紹了 Go 語(yǔ)言讀取文件的幾種方式,ioutil.ReadFile 函數(shù)將整個(gè)文件讀成一個(gè)字符串。這個(gè)函數(shù)很方便,但不應(yīng)該用于非常大的文件。希望能對(duì)你有所幫助!

到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)讀取文件的方式總結(jié)的文章就介紹到這了,更多相關(guān)Go語(yǔ)言讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何使用go-acme/lego實(shí)現(xiàn)自動(dòng)簽發(fā)證書(shū)

    詳解如何使用go-acme/lego實(shí)現(xiàn)自動(dòng)簽發(fā)證書(shū)

    這篇文章主要為大家詳細(xì)介紹了如何使用?go-acme/lego?的客戶端或庫(kù)完成證書(shū)的自動(dòng)簽發(fā),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 超全講解Golang中defer關(guān)鍵字的用法

    超全講解Golang中defer關(guān)鍵字的用法

    本文將從一個(gè)資源回收問(wèn)題引入,引出defer關(guān)鍵字,并對(duì)其進(jìn)行基本介紹,從而讓大家對(duì)Go語(yǔ)言中的defer有更深入的了解,需要的小伙伴可以學(xué)習(xí)一下
    2023-05-05
  • GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用

    本文主要介紹了GO語(yǔ)言不固定參數(shù)函數(shù)與匿名函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go Plugins插件的實(shí)現(xiàn)方式

    Go Plugins插件的實(shí)現(xiàn)方式

    目前 Plugins 僅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 調(diào)用,今天通過(guò)本文給大家介紹Go Plugins插件的實(shí)現(xiàn)方式,感興趣的朋友一起看看吧
    2021-08-08
  • golang之反射和斷言的具體使用

    golang之反射和斷言的具體使用

    這篇文章主要介紹了golang之反射和斷言的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Golang slice切片操作之切片的追加、刪除、插入等

    Golang slice切片操作之切片的追加、刪除、插入等

    這篇文章主要介紹了Golang slice切片操作之切片的追加、刪除、插入等,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    基于go+vue實(shí)現(xiàn)的golang每日新聞數(shù)據(jù)瀏覽與檢索平臺(tái)(推薦)

    gonews是基于 go+vue 實(shí)現(xiàn)的golang每日新聞瀏覽與檢索平臺(tái),本文通過(guò)實(shí)例代碼給大家講解,介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-01-01
  • Go語(yǔ)言中的iota關(guān)鍵字的使用

    Go語(yǔ)言中的iota關(guān)鍵字的使用

    這篇文章主要介紹了Go語(yǔ)言中的iota關(guān)鍵字的使用的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • goquery 入門(安裝使用教程)

    goquery 入門(安裝使用教程)

    這篇文章主要為大家介紹了goquery 入門(安裝使用)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 一文吃透Go的內(nèi)置RPC原理

    一文吃透Go的內(nèi)置RPC原理

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中內(nèi)置RPC的原理。說(shuō)起?RPC?大家想到的一般是框架,Go?作為編程語(yǔ)言竟然還內(nèi)置了?RPC,著實(shí)讓我有些吃鯨,本文就來(lái)一起聊聊吧
    2023-03-03

最新評(píng)論

横山县| 镇远县| 牡丹江市| 桂林市| 大名县| 宁河县| 鹰潭市| 含山县| 古浪县| 慈溪市| 莱州市| 新竹市| 鄂州市| 丹寨县| 梓潼县| 江口县| 克拉玛依市| 漠河县| 三穗县| 团风县| 会理县| 织金县| 大安市| 漠河县| 府谷县| 驻马店市| 会理县| 项城市| 无锡市| 玉田县| 乌鲁木齐市| 大同县| 涞水县| 兴业县| 嘉荫县| 舞阳县| 徐汇区| 大竹县| 大同市| 诸暨市| 上蔡县|