婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 談談對Golang IO讀寫的困惑

談談對Golang IO讀寫的困惑

熱門標簽:賺地圖標注的錢犯法嗎 長沙ai機器人電銷 廣東語音外呼系統供應商 福州鐵通自動外呼系統 地圖標注測試 澳門防封電銷卡 烏魯木齊人工電銷機器人系統 智能電銷機器人營銷 濮陽自動外呼系統代理

前言

Golang的IO讀寫提供了很多種方式,目前本人知道的有io庫、os庫、ioutil庫、bufio庫、bytes/strings庫等。

雖然庫多是一件好事,意味著選擇性多,但讓我困惑的一點是:什么場景下該用哪個庫? 為什么?

在給出結論前,我先想給出Golang內置IO庫的項目結構,主要方便理解和引用:

# 只列舉了核心的目錄及文件
src:
 - bufio
  - bufio.go
 - bytes
  - buffer.go
  - reader.go
 - io
  - ioutil
   - ioutil.go
  - io.go
 - os
  - file.go
 - strings 
  - reader.go

1.io庫屬于底層接口定義庫,其作用是是定義一些基本接口和一些基本常量,并對這些接口的作用給出說明,常見的接口有Reader、Writer等。一般用這個庫只是為了調用它的一些常量,比如io.EOF。

2.ioutil庫包含在io目錄下,它的主要作用是作為一個工具包,里面有一些比較實用的函數,比如 ReadAll(從某個源讀取數據)、ReadFile(讀取文件內容)、WriteFile(將數據寫入文件)、ReadDir(獲取目錄)

3.os庫主要是跟操作系統打交道,所以文件操作基本都會跟os庫掛鉤,比如創建文件、打開一個文件等。這個庫往往會和ioutil庫、bufio庫等配合使用

4.bufio庫可以理解為在io庫上再封裝一層,加上了緩存功能。它可能會和ioutil庫和bytes.Buffer搞混。
4.1 bufio VS ioutil庫:兩者都提供了對文件的讀寫功能,唯一的不同就是bufio多了一層緩存的功能,這個優勢主要體現讀取大文件的時候(ioutil.ReadFile是一次性將內容加載到內存,如果內容過大,很容易爆內存)

4.2 bufio VS bytes.Buffer:兩者都提供一層緩存功能,它們的不同主要在于 bufio 針對的是文件到內存的緩存,而 bytes.Buffer 的針對的是內存到內存的緩存(個人感覺有點像channel,你也可以發現 bytes.Buffer 并沒有提供接口將數據寫到文件)。

5.bytes和strings庫:這兩個庫有點迷,首先它們都實現了Reader接口,所以它們的不同主要在于針對的對象不同,bytes針對的是字節,strings針對的是字符串(它們的方法實現原理很相似)。另一個區別就是 bytes還帶有Buffer的功能,但是 strings沒提供。

注:關于Reader和Writer接口,可以簡單理解為讀取源和寫入源,即只要實現Reader里面的Read方法,這個東西就可以作為一個讀取源,里面可以包含數據并被我們讀取;Writer亦是如此。

以上就是個人的一些結論,下面會針對以上結論做進一步說明,如果有錯誤的地方麻煩請留言指正,比心❤️!

窺探 io 庫

io庫比較常用的接口有三個,分別是Reader,Writer和Close。

// Read方法會接收一個字節數組p,并將讀取到的數據存進該數組,最后返回讀取的字節數n。
// 注意n不一定等于讀取的數據長度,比如字節數組p的容量太小,n會等于數組的長度
type Reader interface {
  Read(p []byte) (n int, err error)
}

// Write 方法同樣接收一個字節數組p,并將接收的數據保存至文件或者標準輸出等,返回的n表示寫入的數據長度。
// 當n不等于len(p)時,返回一個錯誤。
type Writer interface {
  Write(p []byte) (n int, err error)
}

// 關閉操作
type Closer interface {
  Close() error
}

關于 Read 方法的具體實現,可以在strings庫中看到:

// 定義一個Reader接口體
type Reader struct {
  s    string
  i    int64 // current reading index
  prevRune int  // index of previous rune; or  0
}

// 通過NewReader方法得到 reader 對象,這里有個關鍵的地方是傳入的字符串被賦值到 s 變量中
func NewReader(s string) *Reader { 
 return Reader{s, 0, -1} 
}

// Read方法: 核心是 copy 方法,參數b雖然是切片,但是copy方法會影響到它的底層數組
func (r *Reader) Read(b []byte) (n int, err error) {
  if r.i >= int64(len(r.s)) {
    return 0, io.EOF
  }
 r.prevRune = -1
 // 核心方法
  n = copy(b, r.s[r.i:])
  r.i += int64(n)
  return
}

窺探 ioutil 庫

上面提到,ioutil 庫就是一個工具包,里面主要是比較實用的函數,比如ReadFile、WriteFile等,唯一需要注意的是它們都是一次性讀取和一次性寫入,所以當讀取的時候注意文件不能過大。

從文件讀取數據:

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

把數據寫入到文件:

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

遍歷目錄:遍歷目錄有一個需要注意的是它的排序并不是自然排序方式。

窺探bufio庫

bufio 庫在上面也提到過,它主要是在io庫上加了一層緩存的功能,以下是bufio讀取大文件的例子:

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
  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
}

注:

1.bufio 的ReadLine/ReadBytes/ReadString/ReadSlice: ReadString和ReadBytes等同,ReadBytes和ReadLine都調用了ReadSlice

窺探bytes/strings庫

前面提過,就單純實現Reader接口,bytes和strings底層函數的實現方式是差不多的,可以查看其源碼得證:

// bytes/reader.go
// Read implements the io.Reader interface.
func (r *Reader) Read(b []byte) (n int, err error) {
  if r.i >= int64(len(r.s)) {
    return 0, io.EOF
  }
  r.prevRune = -1
  n = copy(b, r.s[r.i:])
  r.i += int64(n)
  return
}

// strings/reader.go
func (r *Reader) Read(b []byte) (n int, err error) {
  if r.i >= int64(len(r.s)) {
    return 0, io.EOF
  }
  r.prevRune = -1
  n = copy(b, r.s[r.i:])
  r.i += int64(n)
  return
}

參考/推薦

詳解golang中bufio包的實現原理
Golang 超大文件讀取的兩個方案
https://gist.github.com/suntong/032173e96247c0411140

到此這篇關于談談對Golang IO讀寫的困惑的文章就介紹到這了,更多相關Golang IO讀寫內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang實現對map的并發讀寫的方法示例
  • Golang通道的無阻塞讀寫的方法示例
  • 詳解golang RWMutex讀寫互斥鎖源碼分析
  • Golang讀寫Excel的方法教程
  • golang簡單讀寫文件示例

標簽:廣西 調研邀請 慶陽 西雙版納 阿克蘇 德州 太原 貴陽

巨人網絡通訊聲明:本文標題《談談對Golang IO讀寫的困惑》,本文關鍵詞  談談,對,Golang,讀,寫的,困惑,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《談談對Golang IO讀寫的困惑》相關的同類信息!
  • 本頁收集關于談談對Golang IO讀寫的困惑的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品88av| 亚洲国产精品av| 99re6这里只有精品视频在线观看| 亚洲图片欧美激情| 国产亚洲制服色| 欧美一区二区免费观在线| 日本高清成人免费播放| 成人午夜短视频| 国产成人精品亚洲日本在线桃色| 亚洲国产精品久久人人爱蜜臀| 国产欧美一区二区在线| 欧美成人高清电影在线| 日本精品一区二区三区高清| 国产福利一区二区三区视频在线 | 精品盗摄一区二区三区| 欧美日韩一区二区电影| 欧美性做爰猛烈叫床潮| 91网站视频在线观看| 国产成人在线视频网址| 国产一区二区网址| 国内精品写真在线观看| 久久99精品国产.久久久久久| 日本aⅴ精品一区二区三区| 亚洲欧洲日韩综合一区二区| 欧美一级片在线看| 日韩一区二区免费电影| 日韩一区二区视频| 精品入口麻豆88视频| 精品国产凹凸成av人导航| 久久先锋影音av| 国产亚洲欧美日韩日本| 国产精品卡一卡二卡三| 亚洲国产成人自拍| 亚洲免费在线观看视频| 性欧美疯狂xxxxbbbb| 美女一区二区久久| 国产91精品精华液一区二区三区| 成人网男人的天堂| 欧美性色黄大片手机版| 日韩一区二区三区免费看| 久久亚洲一级片| 亚洲欧美另类久久久精品2019 | 国产精品伊人色| 国产精品69毛片高清亚洲| 成人综合在线视频| 成人免费视频一区二区| 色婷婷精品久久二区二区蜜臀av| 欧美三级日本三级少妇99| 色噜噜狠狠色综合中国| 91国产免费观看| 欧美精品三级日韩久久| 日韩欧美你懂的| 国产欧美精品一区二区三区四区 | 亚洲欧洲精品一区二区精品久久久| 亚洲人午夜精品天堂一二香蕉| 亚洲一二三四区不卡| 日韩影院精彩在线| av一区二区三区黑人| 欧美日韩卡一卡二| 欧美国产精品专区| 亚洲精品美国一| 成熟亚洲日本毛茸茸凸凹| 欧美日韩国产精选| 成人免费小视频| 国产一区二区免费看| 91超碰这里只有精品国产| 欧美国产精品久久| 美女任你摸久久| 欧美日韩国产天堂| 亚洲免费观看在线视频| 婷婷夜色潮精品综合在线| 成人午夜免费视频| 久久美女高清视频| 日韩av一区二| 欧美少妇bbb| 亚洲欧美国产77777| 国产毛片精品一区| 日韩你懂的在线播放| 亚洲成a人片综合在线| 99精品一区二区三区| 久久久久久9999| 美女久久久精品| 欧美精品自拍偷拍动漫精品| 亚洲人xxxx| 99久久精品国产导航| 国产午夜久久久久| 九色综合国产一区二区三区| 91麻豆精品国产91久久久更新时间| 最新日韩av在线| www.日韩在线| 中文字幕欧美一区| 9人人澡人人爽人人精品| 国产精品久久久久精k8 | 99re免费视频精品全部| 中文字幕av一区二区三区高| 国产精品99久久久| 欧美激情一区不卡| 成人黄色免费短视频| 国产精品久久久久7777按摩| 99免费精品在线| 一个色在线综合| 欧美丝袜丝nylons| 热久久一区二区| 欧美精品一区二区不卡| 国产成人午夜99999| 中文字幕精品—区二区四季| 99久久夜色精品国产网站| 国产精品久久久久久久久快鸭| 色综合天天综合色综合av | 国模大尺度一区二区三区| 7777精品伊人久久久大香线蕉| 亚洲一二三区不卡| 91精品国产综合久久国产大片| 午夜精品免费在线观看| 欧美一三区三区四区免费在线看| 日韩影院精彩在线| 精品少妇一区二区三区在线播放 | 日韩午夜电影av| 激情文学综合丁香| 成人免费视频在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 午夜伦理一区二区| 国产视频一区二区在线观看| 色诱亚洲精品久久久久久| 《视频一区视频二区| 欧美一区二区三区播放老司机| 国产精品亚洲综合一区在线观看| 成人免费视频在线观看| 欧美日韩成人一区| 成人综合婷婷国产精品久久免费| 午夜视频一区二区| 国产精品久久久久7777按摩| 日韩视频一区在线观看| 91香蕉视频污在线| 国产综合色在线| 午夜精品一区二区三区免费视频| 国产精品色婷婷| 日韩欧美另类在线| 欧美在线免费播放| 成人精品国产福利| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲视频在线观看三级| 欧美videossexotv100| 欧美三级在线播放| 91在线观看下载| 国产精品91xxx| 国内不卡的二区三区中文字幕| 婷婷久久综合九色国产成人| 综合亚洲深深色噜噜狠狠网站| 久久久噜噜噜久久中文字幕色伊伊| 欧美色精品在线视频| 91同城在线观看| 国产精品1区2区3区在线观看| 日本在线不卡视频| 亚洲444eee在线观看| 一区二区三区在线看| 国产精品免费久久久久| 久久精品一级爱片| 久久先锋影音av鲁色资源网| 日韩欧美的一区| 欧美一区二区视频免费观看| 欧美日高清视频| 欧美日韩色一区| 色伊人久久综合中文字幕| 成人免费视频一区二区| 国产91精品免费| 成人性生交大片免费看视频在线 | 国产亚洲一二三区| 精品国产成人在线影院 | wwwwxxxxx欧美| 久久久不卡网国产精品一区| 精品国产91亚洲一区二区三区婷婷| 欧美videossexotv100| 精品久久久久久综合日本欧美| 日韩欧美成人午夜| 久久久亚洲精品石原莉奈| 777色狠狠一区二区三区| 欧美日韩三级一区二区| 欧美欧美欧美欧美| 日韩午夜激情免费电影| 精品福利在线导航| 中文字幕一区二区三区视频 | 国产91高潮流白浆在线麻豆| 成人午夜私人影院| 91亚洲永久精品| 欧美日韩一区中文字幕| 日韩午夜激情免费电影| 国产午夜精品一区二区三区视频| √…a在线天堂一区| 亚洲永久精品国产| 久草中文综合在线| www.av亚洲| 精品视频一区 二区 三区| 欧美变态tickling挠脚心| 国产清纯在线一区二区www| 亚洲品质自拍视频网站| 免费av成人在线| 成人免费看视频| 欧美精品tushy高清| 国产亚洲一区二区三区四区|