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

Golang 按行讀取文件的三種方法小結

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

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

1.使用 bufio.Scanner 讀取文件

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

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

Scan 方法的簽名如下:

func (s *Scanner) Scan() bool

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

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

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

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

2.使用 bufio.Reader 讀取文件

除了使用 Scanner 類型之外,我們還可以使用 bufio 包中的 Reader 類型按行讀取文件。在使用 bufio.Reader 時,我們需要使用 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)建一個 Reader 對象。在 for 循環(huán)中,我們使用 ReadString() 函數(shù)讀取每一行的內(nèi)容,并將其追加到字符串切片中。

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

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

使用 bufio.Reader 逐行讀取文件時,除了使用 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ù)的返回值包括三個部分:讀取到的數(shù)據(jù)、是否讀取完整一行以及錯誤信息。如果讀取到的數(shù)據(jù)超出了緩存區(qū)的大小,它會返回一個錯誤信息,而不是完整的一行數(shù)據(jù)。

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

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

4.go-huge-util

本文實現(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 除了類型轉換,還有很多其他實用函數(shù),如加解密、zip 解壓縮等,歡迎大家使用、Star、Issue 和 Pull Request。

參考文獻

dablelv/go-huge-util - GitHub

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

相關文章

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

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

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

    Go?連接?MySQL之?MySQL?預處理詳解

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

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

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

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

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

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

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

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

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

    Golang標準庫之errors包應用方式

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

    Golang中異常處理機制詳解

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

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

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

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

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

最新評論

兴化市| 自贡市| 梨树县| 基隆市| 新兴县| 青田县| 白玉县| 扶绥县| 密云县| 浪卡子县| 甘德县| 曲阳县| 武穴市| 南部县| 平湖市| 监利县| 镇江市| 香河县| 随州市| 三亚市| 廊坊市| 樟树市| 凤冈县| 英德市| 化德县| 武强县| 扶风县| 新沂市| 东宁县| 汽车| 神池县| 宁海县| 灵山县| 淄博市| 石阡县| 石棉县| 班戈县| 建阳市| 鄂托克前旗| 闻喜县| 邯郸县|