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

Go語言的IO庫那么多糾結(jié)該如何選擇

 更新時(shí)間:2021年06月23日 14:18:14   投稿:mrr  
在Go語言中涉及 I/O 操作的內(nèi)置庫有很多種,比如: io 庫, os 庫, ioutil 庫, bufio 庫, bytes 庫, strings 庫等等。擁有這么多內(nèi)置庫是好事,但是具體到涉及 I/O 的場(chǎng)景我們應(yīng)該選擇哪個(gè)庫呢,帶著這個(gè)問題一起通過本文學(xué)習(xí)下吧

在計(jì)算機(jī)和信息技術(shù)領(lǐng)域里 I/O 這個(gè)術(shù)語表示輸入 / 輸出 ( 英語:Input / Output ) ,通常指數(shù)據(jù)在存儲(chǔ)器(內(nèi)部和外部)或其他周邊設(shè)備之間的輸入和輸出,是信息處理系統(tǒng)與外部之間的通信。輸入是系統(tǒng)接收的信號(hào)或數(shù)據(jù),輸出則是從其發(fā)送的信號(hào)或數(shù)據(jù)。

在Go語言中涉及 I/O 操作的內(nèi)置庫有很多種,比如: io 庫, os 庫, ioutil 庫, bufio 庫, bytes 庫, strings 庫等等。擁有這么多內(nèi)置庫是好事,但是具體到涉及 I/O 的場(chǎng)景我們應(yīng)該選擇哪個(gè)庫呢?

io.Reader/Writer

Go語言里使用 io.Reader 和 io.Writer 兩個(gè) interface 來抽象 I/O ,他們的定義如下。

type Reader interface {
 Read(p []byte) (n int, err error)
}

type Writer interface {
 Write(p []byte) (n int, err error)
}

io.Reader 接口代表一個(gè)可以從中讀取字節(jié)流的實(shí)體,而 io.Writer 則代表一個(gè)可以向其寫入字節(jié)流的實(shí)體。

  • io.Reader/Writer 常用的幾種實(shí)現(xiàn)
  • net.Conn: 表示網(wǎng)絡(luò)連接。
  • os.Stdin, os.Stdout, os.Stderr: 標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤。
  • os.File: 網(wǎng)絡(luò),標(biāo)準(zhǔn)輸入輸出,文件的流讀取。
  • strings.Reader: 字符串抽象成 io.Reader 的實(shí)現(xiàn)。
  • bytes.Reader: []byte抽象成 io.Reader 的實(shí)現(xiàn)。
  • bytes.Buffer: []byte抽象成 io.Reader 和 io.Writer 的實(shí)現(xiàn)。
  • bufio.Reader/Writer: 抽帶緩沖的流讀取和寫入(比如按行讀寫)。

除了這幾種實(shí)現(xiàn)外常用的還有 ioutil 工具庫包含了很多IO工具函數(shù),編碼相關(guān)的內(nèi)置庫 encoding/base64 、 encoding/binary 等也是通過 io.Reader 和 io.Writer 實(shí)現(xiàn)各自的編碼功能的。

這些常用實(shí)現(xiàn)和工具庫與io.Reader和io.Writer間的關(guān)系可以用下圖表示。

每種I/O庫的使用場(chǎng)景

io庫

io 庫屬于底層接口定義庫。它的作用主要是定義個(gè) I/O 的基本接口和個(gè)基本常量,并解釋這些接口的功能。在實(shí)際編寫代碼做 I/O 操作時(shí),這個(gè)庫一般只用來調(diào)用它的常量和接口定義,比如用 io.EOF 判斷是否已經(jīng)讀取完,用 io.Reader 做變量的類型聲明。

// 字節(jié)流讀取完后,會(huì)返回io.EOF這個(gè)error
for {
 n, err := r.Read(buf)
 fmt.Println(n, err, buf[:n])
 if err == io.EOF {
  break
 }
}

os 庫

os 庫主要是處理操作系統(tǒng)操作的,它作為Go程序和操作系統(tǒng)交互的橋梁。創(chuàng)建文件、打開或者關(guān)閉文件、Socket等等這些操作和都是和操作系統(tǒng)掛鉤的,所以都通過 os 庫來執(zhí)行。這個(gè)庫經(jīng)常和 ioutil , bufio 等配合使用

ioutil庫

ioutil 庫是一個(gè)有工具包,它提供了很多使用的 IO 工具函數(shù),例如 ReadAll、ReadFile、WriteFile、ReadDir。唯一需要注意的是它們都是一次性讀取和一次性寫入,所以使用時(shí),尤其是把數(shù)據(jù)從文件里一次性讀到內(nèi)存中時(shí)需要注意文件的大小。

讀出文件中的所有內(nèi)容

func readByFile() {
  data, err := ioutil.ReadFile( "./file/test.txt")
  if err != nil {
    log.Fatal("err:", err)
    return
  }
  fmt.Println("data", string(data)) 
}

將數(shù)據(jù)一次性寫入文件

func writeFile() {
  err := ioutil.WriteFile("./file/write_test.txt", []byte("hello world!"), 0644)
  if err != nil {
    panic(err)
    return
  }
}

bufio庫

bufio,可以理解為在 io 庫的基礎(chǔ)上額外封裝加了一個(gè)緩存層,它提供了很多按行進(jìn)行讀寫的函數(shù),從io庫的按字節(jié)讀寫變?yōu)榘葱凶x寫對(duì)寫代碼來說還是方便了不少。

func readBigFile(filePath string) error {
  f, err := os.Open(filePath)
  defer f.Close()

  if err != nil {
    log.Fatal(err)
    return err
  }

  buf := bufio.NewReader(f)
  count := 0
  // 循環(huán)中打印前100行內(nèi)容
  for {
    count += 1
    line, err := buf.ReadString('\n')
    line = strings.TrimSpace(line)
    if err != nil {
      return err
    }
    fmt.Println("line", line)

    if count > 100 {
      break
    }
  }
  return nil
}

  • ReadLine和ReadString方法:buf.ReadLine(),buf.ReadString("\n")都是按行讀,只不過ReadLine讀出來的是[]byte,后者直接讀出了string,最終他們底層調(diào)用的都是ReadSlice方法。
  • bufio VS ioutil 庫:bufio VS 和 ioutil 庫都提供了讀寫文件的能力。它們之間唯一的區(qū)別是 bufio 有一個(gè)額外的緩存層。這個(gè)優(yōu)勢(shì)主要體現(xiàn)在讀取大文件的時(shí)候。

bytes 和 strings 庫

bytes 和 strings 庫里的 bytes.Reader 和string.Reader,它們都實(shí)現(xiàn)了 io.Reader 接口,也都提供了NewReader方法用來從 []byte 或者 string 類型的變量直接構(gòu)建出相應(yīng)的Reader實(shí)現(xiàn)。

r := strings.NewReader("abcde")
// 或者是 bytes.NewReader([]byte("abcde"))
buf := make([]byte, 4)
for {
 n, err := r.Read(buf)
 fmt.Println(n, err, buf[:n])
 if err == io.EOF {
  break
 }
}

另一個(gè)區(qū)別是 bytes 庫有Buffer的功能,而 strings 庫則沒有。

var buf bytes.Buffer
fmt.Fprintf(&buf, "Size: %d MB.", 85)
s := buf.String()) // s == "Size: 85 MB."

總結(jié)

關(guān)于 io.Reader 和 io.Writer 接口,可以簡(jiǎn)單理解為讀源和寫源。也就是說,只要實(shí)現(xiàn)了 Reader 中的 Read 方法,這個(gè)東西就可以作為讀源,里面可以包含數(shù)據(jù),被我們讀取。 Writer 也是如此。

以上是我對(duì)Go語言里做 I/O 操作時(shí)經(jīng)常會(huì)用到的Go語言內(nèi)置庫在使用場(chǎng)景和每個(gè)庫要解決的問題上的一些總結(jié),希望能幫大家理清思路,作為參考,在開發(fā)任務(wù)中需要時(shí)正確選擇合適的庫完成 I/O 操作。如果文章中的敘述有錯(cuò)誤,歡迎留言指正,也歡迎在留言中對(duì)文章內(nèi)容進(jìn)行探討和提出建議。

以上就是Go語言的IO庫那么多糾結(jié)該如何選擇的詳細(xì)內(nèi)容,更多關(guān)于Go語言IO庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang接口IP限流,IP黑名單,IP白名單的實(shí)例

    golang接口IP限流,IP黑名單,IP白名單的實(shí)例

    這篇文章主要介紹了golang接口IP限流,IP黑名單,IP白名單的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go語言中匿名函數(shù)的作用域陷阱詳解

    go語言中匿名函數(shù)的作用域陷阱詳解

    GO語言的匿名函數(shù)(anonymous?function),其實(shí)就是閉包.是指不需要定義函數(shù)名的一種函數(shù)實(shí)現(xiàn)方式,下面這篇文章主要給大家介紹了關(guān)于go語言中匿名函數(shù)作用域陷阱的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Golang中Set類型的實(shí)現(xiàn)方法示例詳解

    Golang中Set類型的實(shí)現(xiàn)方法示例詳解

    這篇文章主要給大家介紹了關(guān)于Golang中Set類型實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Go語言中的閉包詳解

    Go語言中的閉包詳解

    本文詳細(xì)講解了Go語言中的閉包,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • GO 反射對(duì)性能的影響分析

    GO 反射對(duì)性能的影響分析

    這篇文章主要為大家介紹了GO 反射對(duì)性能的影響分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • go語言make初始化的實(shí)現(xiàn)

    go語言make初始化的實(shí)現(xiàn)

    Go語言中的make函數(shù)用于初始化切片、映射和通道,本文就來介紹一下go語言make初始化的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • go語言切片去重的3種方式

    go語言切片去重的3種方式

    go語言中的切片是使用非常頻繁的一個(gè)數(shù)據(jù)結(jié)構(gòu),本文主要介紹了go語言切片去重的3種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Golang利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證詳解

    Golang利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證詳解

    Casbin是一個(gè)強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,Casbin只負(fù)責(zé)訪問控制。本文將利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證功能,需要的可以參考一下
    2023-02-02
  • 使用Viper處理Go應(yīng)用程序的配置方法

    使用Viper處理Go應(yīng)用程序的配置方法

    Viper是一個(gè)應(yīng)用程序配置解決方案,用于Go應(yīng)用程序,它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式,這篇文章主要介紹了使用Viper處理Go應(yīng)用程序的配置,需要的朋友可以參考下
    2023-09-09
  • 使用Go語言簡(jiǎn)單模擬Python的生成器

    使用Go語言簡(jiǎn)單模擬Python的生成器

    這篇文章主要介紹了使用Go語言簡(jiǎn)單模擬Python的生成器,Python的generator是非常酷的功能,用Go實(shí)現(xiàn)的代碼也較為簡(jiǎn)潔,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

中卫市| 京山县| 蓬莱市| 铁岭市| 昌江| 长治县| 内黄县| 万州区| 罗源县| 兖州市| 栖霞市| 潼关县| 仪陇县| 泗阳县| 萨嘎县| 婺源县| 濮阳县| 白沙| 溧水县| 宾川县| 龙海市| 隆德县| 西藏| 阳谷县| 呼图壁县| 绥阳县| 海兴县| 和龙市| 凤阳县| 石阡县| 合山市| 潮州市| 自治县| 伊金霍洛旗| 渭南市| 许昌县| 广宗县| 惠来县| 松桃| 德江县| 西丰县|