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

Go語言讀取文本文件的三種方式總結(jié)

 更新時間:2023年01月12日 11:28:42   作者:宇宙之一粟  
工作中時不時需要讀取文本,文本文件是最常見的文件類型。本文將利用Go語言從逐行、逐個單詞和逐個字符三個方法讀取文件,感興趣的可以了解一下

工作中時不時需要讀取文本,文本文件是最常見的文件類型。

本文將從逐行、逐個單詞和逐個字符三個方法讀取文件:

  • byLine.go
  • byWord.go
  • byCharacter.go

1 逐行讀取文本文件

逐行讀取文件是最為常見的文本文件,也是最為簡單的方式。首先我們需要導(dǎo)入幾個常見的包:

  • bufio:緩存區(qū)讀寫文件
  • flag:命令行參數(shù)解析
package main

import (
  "bufio"
  "flag"
  "fmt"
  "io"
  "os"
)

func lineByLine(file string) error {

  var err error

  f, err := os.Open(file)
  if err != nil {
    return err
  }

  defer f.Close()

  r := bufio.NewReader(f)
  for {
    line, err := r.ReadString('\n')
    if err == io.EOF {
      break
    } else if err != nil {
      fmt.Printf("error reading file %s", err)
      break
    }
    fmt.Print(line)
  }
  return nil
}

func main() {
  flag.Parse()
  if len(flag.Args()) == 0 {
    fmt.Printf("usage: byLine <file1> [<file2> ...]\n")
    return
  }

  for _, file := range flag.Args() {
    err := lineByLine(file)
    if err != nil {
      fmt.Println(err)
    }
  }
}

代碼解釋:

  • 主要通過 bufio.NewReader() 函數(shù)生成一個新的讀取器;
  • 隨后,在 bufio.ReadString() 函數(shù)讀取字符,通知該函數(shù)持續(xù)執(zhí)行讀取任務(wù),直到碰到該 "\n" 參數(shù),也就是換行符。讀到換行符,執(zhí)行文本輸出。
  • 如果讀取中斷了,即 err == io.EOF ,退出文件讀取
  • 或者 err != nil, 打印錯誤提示,退出文件執(zhí)行

main() 函數(shù)中首先讀取命令行參數(shù),如果命令行長度為 0,即沒有傳入要讀取的文件,如果此時執(zhí)行 byLine.go 文件的話就會給出語法提示,如下:

$ go run byLine.go
usage: byLine <file1> [<file2> ...]

我們寫一個測試的文本文件 test.txt, 寫入如下幾行數(shù)據(jù),記得在第二行換行(加入空行):

這是第一行
我是第二行

運(yùn)行如下命令后,結(jié)果為:

$ go run byLine.go test.txt
這是第一行
我是第二行

可以使用 cat test.txt 校驗我們的結(jié)果的準(zhǔn)確性,如下:

$ cat test.txt
這是第一行
我是第二行

2 逐個單詞讀取文本文件

package main

import (
  "bufio"
  "flag"
  "fmt"
  "os"
)

func wordByWord(file string) error {
  var err error
  f, err := os.Open(file)
  if err != nil {
    return err
  }

  defer f.Close()
  scanner := bufio.NewScanner(f)
  scanner.Split(bufio.ScanWords)
  var words []string
  for scanner.Scan() {
    words = append(words, scanner.Text())
  }

  for _, word := range words {
    fmt.Println(word)
  }
  return nil
}

func main() {
  flag.Parse()
  if len(flag.Args()) == 0 {
    fmt.Printf("usage: byWord <file1> [file2> ...]\n")
    return
  }

  for _, file := range flag.Args() {
    err := wordByWord(file)
    if err != nil {
      fmt.Println(err)
    }
  }
}

代碼解釋:

  • 其他代碼都和 byLine.go 函數(shù)一樣,主要是利用了 bufio 中的 scanner 來掃描單詞,
  • scanner := bufio.NewScanner(file) 用來掃描讀取的文件
  • scanner.Split(bufio.ScanWords) 用來分割單詞
  • 聲明一個單詞字符串列表,將讀取到的每一個單詞放入這個列表中
  • 循環(huán)遍歷單詞字符串列表,打印每一個單詞

測試代碼

寫入一個 test.txt 文件:

Hello World
1 2 3

運(yùn)行代碼,結(jié)果顯示:

$ go run byWord.go test.txt
Hello
World
1
2
3

3 逐個字符讀取文本文件

逐個字符讀取文本的使用場景還是很少,除非開發(fā)一個文本編輯器。新建一個 byCharacter.go 文件,然后寫入如下代碼:

package main

import (
  "bufio"
  "flag"
  "fmt"
  "io"
  "os"
)

func charByChar(file string) error {

  var err error
  f, err := os.Open(file)
  if err != nil {
    return err
  }

  defer f.Close()

  r := bufio.NewReader(f)
  for {
    line, err := r.ReadString('\n')
    if err == io.EOF {
      break
    } else if err != nil {
      fmt.Printf("error reading file %s", err)
      return err
    }

    for _, x := range line {
      fmt.Println(string(x))
    }
  }
  return nil
}

func main() {
  flag.Parse()
  if len(flag.Args()) == 0 {
    fmt.Printf("usage: byWord <file1> [file2> ...]\n")
    return
  }

  for _, file := range flag.Args() {
    err := charByChar(file)
    if err != nil {
      fmt.Println(err)
    }
  }
}

運(yùn)行測試用例得出的最后結(jié)果為:

$ go run byCharacter.go test.txt 
H
e
l
l
o
 
W
o
r
l
d

總結(jié)

本文主要介紹 Go 中的 bufio 包,有些情況下,我們并不只是需要讀取整個一大段文件,所以需要把文件通過某種方式讀取,并介紹了 Go 讀取文本文件中的三種方法:

  • 逐行讀取文本文件 byLine.go
  • 逐個單詞讀取文本文件 byWord.go
  • 逐個字符讀取文本文件 byCharacter.go

其實還有更多讀取文本文件的方法,比如通過逗號讀取、讀取特定數(shù)據(jù)量的文本,這些方法留到后文再作介紹

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

相關(guān)文章

  • Go語言實現(xiàn)IP段范圍校驗示例

    Go語言實現(xiàn)IP段范圍校驗示例

    這篇文章主要介紹了Go語言實現(xiàn)IP段范圍校驗示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解go中的引用類型

    詳解go中的引用類型

    這篇文章主要介紹了go中的引用類型,文中給大家提到了值類型和引用類型的區(qū)別,通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 深入淺出go依賴注入工具Wire的使用

    深入淺出go依賴注入工具Wire的使用

    但隨著項目規(guī)模的增長,組件之間的依賴關(guān)系變得復(fù)雜,手動管理可能會很繁瑣,所以本文將深入探討一個備受歡迎的?Go?語言依賴注入工具——?Wire,感興趣的可以了解下
    2023-09-09
  • Go語言method詳解

    Go語言method詳解

    這篇文章主要介紹了Go語言method詳解,本文總結(jié)了在使用method的時候重要注意幾點、指針作為receiver、method繼承等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Golang共享變量如何解決問題

    Golang共享變量如何解決問題

    協(xié)程之間的通信只能夠通過通道。但是我們習(xí)慣于共享變量,而且很多時候使用共享變量能讓代碼更簡潔。那么Golang共享變量如何解決問題,感興趣的可以了解一下
    2021-12-12
  • Go基礎(chǔ)教程系列之WaitGroup用法實例詳解

    Go基礎(chǔ)教程系列之WaitGroup用法實例詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實例詳解,需要的朋友可以參考下
    2022-04-04
  • 使用go語言實現(xiàn)查找兩個數(shù)組的異同操作

    使用go語言實現(xiàn)查找兩個數(shù)組的異同操作

    這篇文章主要介紹了使用go語言實現(xiàn)查找兩個數(shù)組的異同操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine)

    Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine)

    本文主要介紹了Go中阻塞以及非阻塞操作實現(xiàn)(Goroutine和main Goroutine),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • golang中g(shù)in框架接入jwt使用token驗證身份

    golang中g(shù)in框架接入jwt使用token驗證身份

    本文主要介紹了golang中g(shù)in框架接入jwt使用token驗證身份,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言入門Go?Web?Fiber框架快速了解

    Go語言入門Go?Web?Fiber框架快速了解

    這篇文章主要為大家介紹了Go語言入門Go?Web?Fiber框架的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評論

绵竹市| 邢台县| 南陵县| 布拖县| 龙川县| 双鸭山市| 北票市| 邵东县| 鹰潭市| 怀安县| 利津县| 沙坪坝区| 桑植县| 池州市| 容城县| 客服| 沐川县| 福清市| 且末县| 兴安县| 广饶县| 乌海市| 岗巴县| 广丰县| 建平县| 灵川县| 靖安县| 西华县| 宜春市| 宿州市| 通河县| 霍州市| 滨海县| 新和县| 德江县| 土默特右旗| 神池县| 屯门区| 怀柔区| 三亚市| 法库县|