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

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

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

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

1.使用 bufio.Scanner 讀取文件

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

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

Scan 方法的簽名如下:

func (s *Scanner) Scan() bool

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

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

掃描過程中,Scanner會將緩沖區(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 對象。然后在 for 循環(huán)中,我們使用 Scanner 的 Scan() 方法讀取文件的每一行,然后使用 Text() 方法獲取每一行的內(nèi)容。最后,我們將獲取到的行追加到字符串切片中。

2.使用 bufio.Reader 讀取文件

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

// 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 對象。在 for 循環(huán)中,我們使用 ReadString() 函數(shù)讀取每一行的內(nèi)容,并將其追加到字符串切片中。

需要注意的是,在使用 ReadString() 函數(shù)時(shí),我們需要指定分隔符,例如 ‘\n’ 表示以換行符為分隔符。如果讀取的文件中沒有指定的分隔符,ReadString() 函數(shù)會返回一個(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ū)的大小,它會返回一個(gè)錯(cuò)誤信息,而不是完整的一行數(shù)據(jù)。

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

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

4.go-huge-util

本文實(shí)現(xiàn)的函數(shù)已放置開源倉庫 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 除了類型轉(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言中的goroutine和channel如何協(xié)同工作

    Go語言中的goroutine和channel如何協(xié)同工作

    在Go語言中,goroutine和channel是并發(fā)編程的兩個(gè)核心概念,它們協(xié)同工作以實(shí)現(xiàn)高效、安全的并發(fā)執(zhí)行,本文將詳細(xì)探討goroutine和channel如何協(xié)同工作,以及它們在并發(fā)編程中的作用和優(yōu)勢,需要的朋友可以參考下
    2024-04-04
  • Go?連接?MySQL之?MySQL?預(yù)處理詳解

    Go?連接?MySQL之?MySQL?預(yù)處理詳解

    Go語言提供了豐富的庫和工具,可以方便地連接MySQL數(shù)據(jù)庫。MySQL預(yù)處理是一種提高數(shù)據(jù)庫操作效率和安全性的技術(shù)。Go語言中的第三方庫提供了MySQL預(yù)處理的支持,通過使用預(yù)處理語句,可以避免SQL注入攻擊,并且可以提高數(shù)據(jù)庫操作的效率。
    2023-06-06
  • golang中的defer函數(shù)理解

    golang中的defer函數(shù)理解

    defer是Go語言中的延遲執(zhí)行語句,用來添加函數(shù)結(jié)束時(shí)執(zhí)行的代碼,常用于釋放某些已分配的資源、關(guān)閉數(shù)據(jù)庫連接、斷開socket連接、解鎖一個(gè)加鎖的資源,這篇文章主要介紹了golang中的defer函數(shù)理解,需要的朋友可以參考下
    2022-10-10
  • Go語言原子操作及互斥鎖的區(qū)別

    Go語言原子操作及互斥鎖的區(qū)別

    原子操作就是不可中斷的操作,本文主要介紹了Go語言原子操作及互斥鎖的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • go單體日志采集zincsearch方案實(shí)現(xiàn)

    go單體日志采集zincsearch方案實(shí)現(xiàn)

    這篇文章主要為大家介紹了go單體日志采集zincsearch方案實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語言實(shí)現(xiàn)彩色輸出示例詳解

    Go語言實(shí)現(xiàn)彩色輸出示例詳解

    這篇文章主要為大家介紹了Go語言實(shí)現(xiàn)彩色輸出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Golang標(biāo)準(zhǔn)庫之errors包應(yīng)用方式

    Go語言的errors包提供了基礎(chǔ)的錯(cuò)誤處理能力,允許通過errors.New創(chuàng)建自定義error對象,error在Go中是一個(gè)接口,通過實(shí)現(xiàn)Error方法來定義錯(cuò)誤文本,對錯(cuò)誤的比較通常基于對象地址,而非文本內(nèi)容,因此即使兩個(gè)錯(cuò)誤文本相同
    2024-10-10
  • Golang中異常處理機(jī)制詳解

    Golang中異常處理機(jī)制詳解

    這篇文章主要給大家介紹了關(guān)于Golang中異常處理機(jī)制的相關(guān)資料,其實(shí)Go語言的異常捕獲要比Python中簡單的多,它沒有Python中那么多復(fù)雜的異常類型及繼承體系,需要的朋友可以參考下
    2021-06-06
  • 簡單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    簡單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    在golang當(dāng)中defer代碼塊會在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計(jì)算參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Go實(shí)現(xiàn)比較時(shí)間大小

    Go實(shí)現(xiàn)比較時(shí)間大小

    這篇文章主要介紹了Go實(shí)現(xiàn)比較時(shí)間大小的方法和示例,非常的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-04-04

最新評論

通江县| 登封市| 赞皇县| 浦北县| 铜川市| 奎屯市| 新津县| 禹州市| 溧阳市| 安宁市| 韶山市| 高陵县| 祁东县| 仪陇县| 无为县| 高雄县| 光泽县| 香河县| 昌乐县| 中卫市| 汕头市| 淮阳县| 吉水县| 长兴县| 东山县| 平远县| 双牌县| 隆安县| 沂源县| 兴国县| 宽城| 上思县| 宁陵县| 浦江县| 泾阳县| 进贤县| 化德县| 成武县| 乌恰县| 三河市| 凌云县|