校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 談?wù)剬olang IO讀寫的困惑

談?wù)剬olang IO讀寫的困惑

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

前言

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

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

在給出結(jié)論前,我先想給出Golang內(nèi)置IO庫的項目結(jié)構(gòu),主要方便理解和引用:

# 只列舉了核心的目錄及文件
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等。一般用這個庫只是為了調(diào)用它的一些常量,比如io.EOF。

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

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

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

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

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

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

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

窺探 io 庫

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

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

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

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

關(guān)于 Read 方法的具體實現(xiàn),可以在strings庫中看到:

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

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

// Read方法: 核心是 copy 方法,參數(shù)b雖然是切片,但是copy方法會影響到它的底層數(shù)組
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 庫就是一個工具包,里面主要是比較實用的函數(shù),比如ReadFile、WriteFile等,唯一需要注意的是它們都是一次性讀取和一次性寫入,所以當(dāng)讀取的時候注意文件不能過大。

從文件讀取數(shù)據(jù):

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

把數(shù)據(jù)寫入到文件:

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都調(diào)用了ReadSlice

窺探bytes/strings庫

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

// 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包的實現(xiàn)原理
Golang 超大文件讀取的兩個方案
https://gist.github.com/suntong/032173e96247c0411140

到此這篇關(guān)于談?wù)剬olang IO讀寫的困惑的文章就介紹到這了,更多相關(guān)Golang IO讀寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

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

標(biāo)簽:廣西 調(diào)研邀請 慶陽 西雙版納 阿克蘇 德州 太原 貴陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《談?wù)剬olang IO讀寫的困惑》,本文關(guān)鍵詞  談?wù)?對,Golang,讀,寫的,困惑,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《談?wù)剬olang IO讀寫的困惑》相關(guān)的同類信息!
  • 本頁收集關(guān)于談?wù)剬olang IO讀寫的困惑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品美女久久久久高潮| 欧美极品另类videosde| 国产午夜三级一区二区三| 国产在线视视频有精品| 精品国产一区二区三区四区四 | 免费观看91视频大全| 精品奇米国产一区二区三区| 国产成人精品网址| 亚洲综合色婷婷| 精品日本一线二线三线不卡| 91在线无精精品入口| 麻豆成人av在线| 国产精品久久久久一区二区三区| 色久综合一二码| 精品一区二区三区欧美| 成人欧美一区二区三区| 日韩欧美的一区二区| av亚洲产国偷v产偷v自拍| 奇米影视一区二区三区| |精品福利一区二区三区| 91精品国产一区二区| k8久久久一区二区三区 | 婷婷亚洲久悠悠色悠在线播放| 2022国产精品视频| 精品视频资源站| 波多野洁衣一区| 经典三级在线一区| 午夜影院在线观看欧美| 国产精品久久久久婷婷二区次| 91精品国产欧美一区二区| 91久久一区二区| 9人人澡人人爽人人精品| 国产精品一线二线三线精华| 日韩经典一区二区| 一区二区三区高清不卡| 亚洲欧美在线aaa| 中文字幕免费观看一区| 久久综合久久综合久久| 91麻豆精品国产91久久久久久| 91麻豆精品秘密| 成人av网站在线| 国产91富婆露脸刺激对白| 国产一区二区0| 日本v片在线高清不卡在线观看| 亚洲最大的成人av| 亚洲最大的成人av| 午夜一区二区三区在线观看| 樱花草国产18久久久久| 中文字幕日本不卡| 综合久久一区二区三区| 成人免费在线视频| 亚洲综合在线观看视频| 一区二区三区国产精华| 亚洲国产中文字幕在线视频综合 | 欧美日韩激情一区二区三区| 欧美在线播放高清精品| 欧美日韩午夜影院| 91精品国产综合久久久蜜臀图片| 欧美色精品在线视频| 91精品国产91综合久久蜜臀| 欧美一卡2卡3卡4卡| 欧美疯狂性受xxxxx喷水图片| 这里只有精品99re| 亚洲精品一线二线三线| 国产丝袜欧美中文另类| 亚洲乱码中文字幕| 日本成人在线电影网| 国产一区二区三区精品视频| 国产91精品欧美| 欧美色图12p| 久久免费精品国产久精品久久久久 | www.成人在线| 欧美狂野另类xxxxoooo| 久久夜色精品一区| 国产精品成人一区二区三区夜夜夜 | 99re这里都是精品| 欧美久久久久久久久久| 精品对白一区国产伦| 国产精品久久久久久久久久免费看| 亚洲三级电影全部在线观看高清| 一区2区3区在线看| 精品一区二区三区在线视频| 成人亚洲精品久久久久软件| 91国偷自产一区二区使用方法| 欧美电影影音先锋| 国产精品全国免费观看高清| 亚洲成人免费在线观看| 国产成人精品aa毛片| 精品视频免费看| 欧美韩国日本不卡| 美国欧美日韩国产在线播放| 成人av在线一区二区三区| 在线播放中文一区| 国产精品久久久久久久久免费樱桃| 日本在线不卡视频| 在线看国产一区| 日本一区二区三区国色天香| 亚洲成人综合在线| thepron国产精品| www国产精品av| 日韩av网站在线观看| 91麻豆成人久久精品二区三区| 日韩精品专区在线| 五月天精品一区二区三区| 99国产精品99久久久久久| 欧美成人video| 偷拍日韩校园综合在线| 欧美在线你懂的| 最新国产成人在线观看| 国产宾馆实践打屁股91| 精品成人一区二区三区四区| 青青草国产精品97视觉盛宴| 色素色在线综合| 亚洲色图一区二区| 99视频在线精品| 久久精品亚洲乱码伦伦中文| 国产一区二区三区免费播放| 26uuu精品一区二区三区四区在线| 免费国产亚洲视频| 日韩精品一区二| 久久国产欧美日韩精品| 精品sm捆绑视频| 国产一区二区三区在线观看免费视频| 日韩写真欧美这视频| 青青国产91久久久久久| 欧美成人高清电影在线| 国产一区二区三区香蕉| 国产亚洲午夜高清国产拍精品| 国产麻豆精品在线观看| 国产欧美一区二区三区网站| 国产高清无密码一区二区三区| 久久久久久久综合日本| 国产成人亚洲综合a∨猫咪| 久久久久久久久久久久电影 | 色88888久久久久久影院野外| 一区二区三国产精华液| 欧美亚洲高清一区二区三区不卡| 18欧美亚洲精品| 99re亚洲国产精品| 亚洲一区二区欧美| 91精品啪在线观看国产60岁| 麻豆一区二区三| 中文字幕中文字幕中文字幕亚洲无线| 成人综合婷婷国产精品久久 | 国产黄色精品视频| 国产精品女人毛片| 在线亚洲人成电影网站色www| 亚洲午夜免费福利视频| 日韩一区二区影院| 国产成人午夜视频| 亚洲午夜免费电影| 精品美女一区二区| 91性感美女视频| 美女视频一区在线观看| 国产精品嫩草99a| 欧美午夜精品一区二区三区| 久久国产精品无码网站| 中文字幕人成不卡一区| 51午夜精品国产| 91色婷婷久久久久合中文| 免费一级片91| 亚洲免费视频中文字幕| 欧美r级电影在线观看| 色视频成人在线观看免| 免费在线看一区| 亚洲狠狠丁香婷婷综合久久久| 日韩午夜在线观看| 91免费观看视频| 国内外精品视频| 五月综合激情婷婷六月色窝| 国产精品久久久一区麻豆最新章节| 91精品国产色综合久久不卡电影| a在线播放不卡| 国产自产v一区二区三区c| 五月婷婷综合激情| 一区二区三区四区在线播放| 久久久国产午夜精品| 欧美日韩卡一卡二| av成人动漫在线观看| 国产精品综合久久| 免费精品99久久国产综合精品| 亚洲综合久久久| 亚洲丝袜制服诱惑| 国产精品另类一区| 久久色成人在线| 欧美tickling挠脚心丨vk| 欧美剧情片在线观看| 欧美三级三级三级爽爽爽| eeuss鲁片一区二区三区| 高清成人免费视频| 国产一区二区免费视频| 蜜桃av一区二区三区| 丝袜诱惑亚洲看片| 亚洲亚洲精品在线观看| 亚洲激情成人在线| 亚洲一区二区三区激情| 亚洲一区二区精品久久av| 亚洲精品成人在线| 亚洲一区二区在线视频| 一区二区三区产品免费精品久久75|