亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang 按行讀取文件的三種方法小結(jié)

 更新時(shí)間:2023年04月25日 09:14:21   作者:戀喵大鯉魚(yú)  
本文主要介紹了Golang 按行讀取文件的三種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Golang 是一種現(xiàn)代的編程語(yǔ)言,它具有高效、簡(jiǎn)潔和可擴(kuò)展等特點(diǎn),因此在各種領(lǐng)域廣泛應(yīng)用。在 Golang 中,讀取文件是一個(gè)常見(jiàn)的操作。在本篇技術(shù)博客中,我將介紹如何在 Golang 中按行讀取文件。

1.使用 bufio.Scanner 讀取文件

Golang 中有一個(gè) bufio 包,它提供了 Scanner 類(lèi)型,可以方便地按行讀取文件。我們可以使用 Scanner 的 Scan() 方法來(lái)讀取每一行。

bufio.Scanner是一個(gè)基于緩沖區(qū)的數(shù)據(jù)掃描器,它提供了方便的逐行/逐詞讀取操作。Scan 方法是bufio.Scanner 的一個(gè)核心方法,用于掃描緩沖區(qū)中的數(shù)據(jù)并返回掃描到的下一個(gè) Token。

Scan 方法的簽名如下:

func (s *Scanner) Scan() bool

該方法返回一個(gè) bool 類(lèi)型值,表示掃描是否成功。如果掃描成功,該方法會(huì)將下一個(gè)Token讀取出來(lái)并保存在Scanner的Text字段中。如果掃描失敗,則返回false。

在讀取Token之前,Scanner會(huì)將緩沖區(qū)中的數(shù)據(jù)讀取到底層的Reader中,并從底層的Reader中獲取新的數(shù)據(jù)填充到緩沖區(qū)中。因此,在Scan方法調(diào)用之前,Scanner的緩沖區(qū)中可能已經(jīng)包含了一部分?jǐn)?shù)據(jù),也可能為空。

掃描過(guò)程中,Scanner會(huì)將緩沖區(qū)中的數(shù)據(jù)按照分隔符進(jìn)行分割,并將分割后的Token返回。默認(rèn)情況下,Scanner使用換行符作為分隔符,即每次掃描一行數(shù)據(jù)。如果需要使用其他分隔符,可以使用Scanner的Split方法進(jìn)行設(shè)置。

// ReadLines reads all lines of the file.
func ReadLines(path string) ([]string, error) {
?? ?file, err := os.Open(path)
?? ?if err != nil {
?? ??? ?return nil, err
?? ?}
?? ?defer file.Close()

?? ?var lines []string
?? ?scanner := bufio.NewScanner(file)
?? ?for scanner.Scan() {
?? ??? ?lines = append(lines, scanner.Text())
?? ?}
?? ?return lines, scanner.Err()
}

上面的代碼中,我們首先使用 NewScanner() 函數(shù)創(chuàng)建一個(gè) Scanner 對(duì)象。然后在 for 循環(huán)中,我們使用 Scanner 的 Scan() 方法讀取文件的每一行,然后使用 Text() 方法獲取每一行的內(nèi)容。最后,我們將獲取到的行追加到字符串切片中。

2.使用 bufio.Reader 讀取文件

除了使用 Scanner 類(lèi)型之外,我們還可以使用 bufio 包中的 Reader 類(lèi)型按行讀取文件。在使用 bufio.Reader 時(shí),我們需要使用 ReadBytes() 或 ReadString() 方法來(lái)讀取每一行,示例代碼如下:

// ReadLinesV2 reads all lines of the file.
func ReadLinesV2(path string) ([]string, error) {
?? ?file, err := os.Open(path)
?? ?if err != nil {
?? ??? ?return nil, err
?? ?}
?? ?defer file.Close()

?? ?var lines []string
?? ?reader := bufio.NewReader(file)
?? ?for {
?? ??? ?// ReadString reads until the first occurrence of delim in the input,
?? ??? ?// returning a string containing the data up to and including the delimiter.
?? ??? ?line, err := reader.ReadString('\n')
?? ??? ?if err == io.EOF {
?? ??? ??? ?lines = append(lines, line)
?? ??? ??? ?break
?? ??? ?}
?? ??? ?if err != nil {
?? ??? ??? ?return lines, err
?? ??? ?}
?? ??? ?lines = append(lines, line[:len(line)-1])
?? ?}
?? ?return lines, nil
}

上面的代碼中,我們使用 NewReader() 函數(shù)創(chuàng)建一個(gè) Reader 對(duì)象。在 for 循環(huán)中,我們使用 ReadString() 函數(shù)讀取每一行的內(nèi)容,并將其追加到字符串切片中。

需要注意的是,在使用 ReadString() 函數(shù)時(shí),我們需要指定分隔符,例如 ‘\n’ 表示以換行符為分隔符。如果讀取的文件中沒(méi)有指定的分隔符,ReadString() 函數(shù)會(huì)返回一個(gè)錯(cuò)誤,因此我們需要在 for 循環(huán)中檢查是否發(fā)生了錯(cuò)誤。

3.使用 bufio.Reader 的 ReadLine 讀取文件

使用 bufio.Reader 逐行讀取文件時(shí),除了使用 ReadBytes() 或 ReadString() 方法,還可以使用 ReadLine() 函數(shù)。

// ReadLinesV3 reads all lines of the file.
func ReadLinesV3(path string) ([]string, error) {
?? ?f, err := os.Open(path)
?? ?if err != nil {
?? ??? ?return nil, err
?? ?}
?? ?defer f.Close()

?? ?var lines []string
?? ?r := bufio.NewReader(f)
?? ?for {
?? ??? ?// ReadLine is a low-level line-reading primitive.
?? ??? ?// Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
?? ??? ?bytes, _, err := r.ReadLine()
?? ??? ?if err == io.EOF {
?? ??? ??? ?break
?? ??? ?}
?? ??? ?if err != nil {
?? ??? ??? ?return lines, err
?? ??? ?}
?? ??? ?lines = append(lines, string(bytes))
?? ?}
?? ?return lines, nil
}

使用 bufio.Reader 的 ReadLine() 方法可以讀取一行數(shù)據(jù),但是需要注意它的返回值。ReadLine() 函數(shù)的返回值包括三個(gè)部分:讀取到的數(shù)據(jù)、是否讀取完整一行以及錯(cuò)誤信息。如果讀取到的數(shù)據(jù)超出了緩存區(qū)的大小,它會(huì)返回一個(gè)錯(cuò)誤信息,而不是完整的一行數(shù)據(jù)。

因此,如果讀取的一行數(shù)據(jù)的長(zhǎng)度超過(guò)了緩存區(qū)的大小,ReadLine() 函數(shù)將無(wú)法讀取到完整的一行數(shù)據(jù)。為了避免這種情況的發(fā)生,我們可以通過(guò)設(shè)置緩存區(qū)的大小來(lái)解決。

ReadLine 是一個(gè)低級(jí)的行讀取原語(yǔ)。大多數(shù)調(diào)用者應(yīng)該使用 ReadBytes(‘\n’) 或 ReadString(‘\n’),或者使用 Scanner。

4.go-huge-util

本文實(shí)現(xiàn)的函數(shù)已放置開(kāi)源倉(cāng)庫(kù) dablelv/go-huge-util,歡迎大家使用。

package main

import (
?? ?"github.com/dablelv/go-huge-util/file"
)

func main() {
?? ?path := "your/file/path"
?? ?lines, err := file.ReadLines(path)
?? ?lines, err = file.ReadLinesV2(path)
?? ?lines, err = file.ReadLinesV3(path)
}

推薦使用 file.ReadLines。

go-huge-util 除了類(lèi)型轉(zhuǎn)換,還有很多其他實(shí)用函數(shù),如加解密、zip 解壓縮等,歡迎大家使用、Star、Issue 和 Pull Request。

參考文獻(xiàn)

dablelv/go-huge-util - GitHub

到此這篇關(guān)于Golang 按行讀取文件的三種方法小結(jié)的文章就介紹到這了,更多相關(guān)Golang 按行讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Go你不得不知道的一些實(shí)用小技巧

    關(guān)于Go你不得不知道的一些實(shí)用小技巧

    開(kāi)發(fā)語(yǔ)言上Go成為高并發(fā)業(yè)務(wù)開(kāi)發(fā)的主流語(yǔ)言,再加上云原生技術(shù)底座的驅(qū)動(dòng),Go語(yǔ)言風(fēng)光無(wú)限,下面這篇文章主要給大家介紹了關(guān)于Go你不得不知道的一些實(shí)用小技巧,需要的朋友可以參考下
    2022-11-11
  • golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn)

    這篇文章主要介紹了golang對(duì)etcd存取和數(shù)值監(jiān)測(cè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • VSCode1.4 搭建Golang的開(kāi)發(fā)調(diào)試環(huán)境(遇到很多問(wèn)題)

    VSCode1.4 搭建Golang的開(kāi)發(fā)調(diào)試環(huán)境(遇到很多問(wèn)題)

    這篇文章主要介紹了VSCode1.4 搭建Golang的開(kāi)發(fā)調(diào)試環(huán)境(遇到很多問(wèn)題),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • go?字符串修改的操作代碼

    go?字符串修改的操作代碼

    這篇文章主要介紹了go?字符串修改,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Go每日一庫(kù)之quicktemplate的使用

    Go每日一庫(kù)之quicktemplate的使用

    quicktemplate快速、功能強(qiáng)大、易于使用的Go模板引擎。比html/模板快20倍,本文我們就詳細(xì)的介紹一下quicktemplate的具體使用,感興趣的可以了解一下
    2021-07-07
  • 一文詳解Go語(yǔ)言io.LimitedReader類(lèi)型

    一文詳解Go語(yǔ)言io.LimitedReader類(lèi)型

    這篇文章主要為大家介紹了Go語(yǔ)言io.LimitedReader類(lèi)型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Go?interface{}?轉(zhuǎn)切片類(lèi)型的實(shí)現(xiàn)方法

    Go?interface{}?轉(zhuǎn)切片類(lèi)型的實(shí)現(xiàn)方法

    本文主要介紹了Go?interface{}?轉(zhuǎn)切片類(lèi)型的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Golang連接池的幾種實(shí)現(xiàn)案例小結(jié)

    Golang連接池的幾種實(shí)現(xiàn)案例小結(jié)

    這篇文章主要介紹了Golang連接池的幾種實(shí)現(xiàn)案例小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • golang?cache帶索引超時(shí)緩存庫(kù)實(shí)戰(zhàn)示例

    golang?cache帶索引超時(shí)緩存庫(kù)實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了golang?cache帶索引超時(shí)緩存庫(kù)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • go-zero源碼閱讀之布隆過(guò)濾器實(shí)現(xiàn)代碼

    go-zero源碼閱讀之布隆過(guò)濾器實(shí)現(xiàn)代碼

    布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是空間效率和查詢(xún)時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難,這篇文章主要介紹了go-zero源碼閱讀-布隆過(guò)濾器,需要的朋友可以參考下
    2023-02-02

最新評(píng)論