亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > golang中bufio.SplitFunc的深入理解

golang中bufio.SplitFunc的深入理解

熱門標簽:浙江高速公路地圖標注 學海導航地圖標注 廣州呼叫中心外呼系統 江西轉化率高的羿智云外呼系統 高德地圖標注口訣 西部云谷一期地圖標注 南通如皋申請開通400電話 地圖標注的汽車標 中國地圖標注省會高清

前言

bufio模塊是golang標準庫中的模塊之一,主要是實現了一個讀寫的緩存,用于對數據的讀取或者寫入操作。該模塊在多個涉及io的標準庫中被使用,比如http模塊中使用buffio來完成網絡數據的讀寫,壓縮文件的zip模塊利用bufio來操作文件數據的讀寫等。

golang的bufio包里面定以的SplitFunc是一個比較重要也比較難以理解的東西,本文希望通過結合簡單的實例介紹SplitFunc的工作原理以及如何實現一個自己的SplitFunc。

一個例子

在bufio包里面定義了一些常用的工具比如Scanner,你可能需要讀取用戶在標準輸入里面輸入的一些東西,比如我們做一個復讀機,讀取用戶的每一行輸入,然后打印出來:

package main
import (
 "bufio"
 "fmt"
 "os"
)
func main() {
 scanner := bufio.NewScanner(os.Stdin)
 scanner.Split(bufio.ScanLines)
 for scanner.Scan() {
 fmt.Println(scanner.Text())
 }
}

這個程序很簡單,os.Stdin實現了io.Reader接口,我們從這個reader創建了一個scanner,設置分割函數為bufio.ScanLines,然后for循環,每次讀到一行數據就將文本內容打印出來。麻雀雖小五臟俱全,這個小程序雖然簡單,卻引出了我們今天要介紹的對象: bufio.SplitFunc,它的定義是這個樣子的:

package "buffio"
type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

golang官方文檔的描述是這個樣子的:

SplitFunc is the signature of the split function used to tokenize the input. The arguments are an initial substring of the remaining unprocessed data and a flag, atEOF, that reports whether the Reader has no more data to give. The return values are the number of bytes to advance the input and the next token to return to the user, if any, plus an error, if any.

Scanning stops if the function returns an error, in which case some of the input may be discarded.

Otherwise, the Scanner advances the input. If the token is not nil, the Scanner returns it to the user. If the token is nil, the Scanner reads more data and continues scanning; if there is no more data--if atEOF was true--the Scanner returns. If the data does not yet hold a complete token, for instance if it has no newline while scanning lines, a SplitFunc can return (0, nil, nil) to signal the Scanner to read more data into the slice and try again with a longer slice starting at the same point in the input.

The function is never called with an empty data slice unless atEOF is true. If atEOF is true, however, data may be non-empty and, as always, holds unprocessed text.

英文!參數這么多!返回值這么多!好煩!不知道各位讀者遇到這種文檔會不會有這種感覺...正式由于這種情況,我才決定寫一篇文章介紹一下SplitFunc的具體工作原理,用一種通俗的方式結合具體實例加以說明,希望對讀者有所幫助。
好了,廢話少說,開始正題吧!

Scanner和SplitFunc的工作機制

package "buffio"
type SplitFunc func(data []byte, atEOF bool) (advance int, token []byte, err error)

Scanner是有緩存的,意思是Scanner底層維護了一個Slice用來保存已經從Reader中讀取的數據,Scanner會調用我們設置SplitFunc,將緩沖區內容(data)和是否已經輸入完了(atEOF)以參數的形式傳遞給SplitFunc,而SplitFunc的職責就是根據上述的兩個參數返回下一次Scan需要前進幾個字節(advance),分割出來的數據(token),以及錯誤(err)。

這是一個通信雙向的過程,Scanner告訴我們的SplitFunc已經掃描到的數據和是否到結尾了,我們的SplitFunc則根據這些信息將分割的結果返回和下次掃描需要前進的位置返回給Scanner。用一個例子來說明:

package main
import (
 "bufio"
 "fmt"
 "strings"
)
func main() {
 input := "abcdefghijkl"
 scanner := bufio.NewScanner(strings.NewReader(input))
 split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
  fmt.Printf("%t\t%d\t%s\n", atEOF, len(data), data)
  return 0, nil, nil
 }
 scanner.Split(split)
 buf := make([]byte, 2)
 scanner.Buffer(buf, bufio.MaxScanTokenSize)
 for scanner.Scan() {
  fmt.Printf("%s\n", scanner.Text())
 }
}

輸出

false 2 ab
false 4 abcd
false 8 abcdefgh
false 12 abcdefghijkl
true 12 abcdefghijkl

這里我們把緩沖區的初始大小設置為了2,不夠的時候會擴展為原來的2倍,最大為bufio.MaxScanTokenSize,這樣一開始掃描2個字節,我們的緩沖區就滿了,reader的內容還沒有讀取到EOF,然后split函數執行,輸出:

false 2 ab

緊接著函數返回 0, nil, nil這個返回值告訴Scanner數據不夠,下次讀取的位置前進0位,需要繼續從reader里面讀取,此時因為緩沖區滿了,所以容量擴展為2 * 2 = 4,reader的內容還沒有讀取到EOF,輸出

false 4 abcd

重復上述步驟,一直到最后全部內容讀取完了,EOF此時變成了true

true 12 abcdefghijkl

看了上面的過程是不是對SplitFunc的工作原來有了一點理解了呢?再回頭看一下golang的官方文檔有沒有覺得稍微理解了一點?下面是bufio.ScanLines的實現,讀者可以自己研究一下該函數是如何工作的

標準庫里的ScanLines

func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
 // 表示我們已經掃描到結尾了
 if atEOF  len(data) == 0 {
  return 0, nil, nil
 }
 // 找到\n的位置
 if i := bytes.IndexByte(data, '\n'); i >= 0 {
  // 把下次開始讀取的位置向前移動i + 1位
  return i + 1, dropCR(data[0:i]), nil
 }
 // 這里處理的reader內容全部讀取完了,但是內容不為空,所以需要把剩余的數據返回
 if atEOF {
  return len(data), dropCR(data), nil
 }
 // 表示現在不能分割,向Reader請求更多的數據
 return 0, nil, nil
}

參考

In-depth introduction to bufio.Scanner in Golang

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 淺談golang類型斷言,失敗類型斷言返回值問題
  • 通過匯編看golang函數的多返回值問題
  • Golang的func參數及返回值操作

標簽:德宏 吐魯番 東營 常州 貴州 曲靖 保定 許昌

巨人網絡通訊聲明:本文標題《golang中bufio.SplitFunc的深入理解》,本文關鍵詞  golang,中,bufio.SplitFunc,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中bufio.SplitFunc的深入理解》相關的同類信息!
  • 本頁收集關于golang中bufio.SplitFunc的深入理解的相關信息資訊供網民參考!
  • 推薦文章
    国产视频一区二区在线播放| 青草国产在线| 成人高清免费| 亚洲精品影院一区二区| 国产美女在线一区二区三区| 欧美激情影院| 国产一区二区高清视频| 黄视频网站在线观看| 台湾毛片| 美女被草网站| 日日日夜夜操| 高清一级片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产综合91天堂亚洲国产| 日韩免费片| 天天做人人爱夜夜爽2020毛片| 你懂的在线观看视频| 精品视频在线观看免费| 国产极品白嫩美女在线观看看| 香蕉视频三级| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人av在线播放| 久久国产影视免费精品| 精品毛片视频| 台湾毛片| 成人av在线播放| 午夜在线亚洲男人午在线| 天堂网中文字幕| 二级片在线观看| 日韩专区第一页| 黄色免费三级| 你懂的福利视频| 人人干人人草| 一级女人毛片人一女人| 天天做人人爱夜夜爽2020毛片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美激情一区二区三区视频 | 成人影院一区二区三区| 毛片高清| 国产高清在线精品一区a| 久久99中文字幕| 欧美激情中文字幕一区二区| 精品久久久久久中文字幕一区 | 尤物视频网站在线观看| 日本特黄特黄aaaaa大片| 亚洲不卡一区二区三区在线 | 九九九在线视频| 日韩av成人| 成人影院一区二区三区| 免费的黄视频| 国产视频一区二区在线播放| 精品国产三级a| 久久99中文字幕| 精品视频在线观看免费| 国产麻豆精品视频| 一级女性全黄久久生活片| 美女免费精品高清毛片在线视| 国产一区精品| 成人影院一区二区三区| 精品国产一区二区三区久久久蜜臀| 成人影视在线播放| 天天色成人| 日韩一级黄色| 成人高清免费| 日韩av成人| 国产麻豆精品视频| 免费的黄视频| 四虎精品在线观看| 天天做人人爱夜夜爽2020毛片| 亚欧成人乱码一区二区| 免费国产在线观看| 成人高清免费| 精品视频免费观看| 国产视频一区二区三区四区| 国产一区二区精品在线观看| 精品国产亚洲一区二区三区| 99色视频在线| 国产一区二区精品在线观看| 国产伦精品一区二区三区在线观看| 黄视频网站在线观看| 成人免费观看的视频黄页| 精品国产三级a| 午夜在线亚洲男人午在线| 欧美激情一区二区三区在线播放| 成人a大片在线观看| 成人高清免费| 二级片在线观看| 91麻豆精品国产片在线观看| 天天色色网| 久久国产精品永久免费网站| 色综合久久天天综合绕观看| 国产一区二区精品在线观看| 精品视频在线观看一区二区| 色综合久久天天综合| 精品国产一区二区三区久| 久久99爰这里有精品国产| 国产精品自拍亚洲| 麻豆系列国产剧在线观看| 欧美日本免费| 亚欧成人乱码一区二区| 欧美国产日韩一区二区三区| 国产成人啪精品视频免费软件| 欧美a级大片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩免费在线视频| 精品国产香蕉伊思人在线又爽又黄| 精品国产香蕉伊思人在线又爽又黄| 久久成人亚洲| 国产不卡高清在线观看视频| 999久久66久6只有精品| 国产一区二区高清视频| 色综合久久天天综合绕观看| 日本免费看视频| 国产伦精品一区二区三区在线观看| 亚飞与亚基在线观看| 一级女人毛片人一女人| 国产伦精品一区二区三区在线观看| 青青久在线视频| 成人免费观看的视频黄页| 黄视频网站在线免费观看| 国产91精品系列在线观看| 成人影视在线播放| 天天做日日爱夜夜爽| 免费的黄视频| 久草免费在线观看| 精品国产亚一区二区三区| 亚欧成人乱码一区二区| 欧美18性精品| a级毛片免费全部播放| 黄色免费三级| 亚洲精品中文字幕久久久久久| 国产亚洲男人的天堂在线观看| 麻豆系列国产剧在线观看| 青青久在线视频| 日本免费看视频| a级黄色毛片免费播放视频| 精品毛片视频| 亚洲精品影院一区二区| 国产一级生活片| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 黄色福利片| 国产综合91天堂亚洲国产| 美女被草网站| 欧美爱色| 欧美激情伊人| 午夜家庭影院| 精品久久久久久免费影院| 久久99爰这里有精品国产| 欧美一级视频免费观看| 国产不卡高清在线观看视频| 香蕉视频三级| 国产一区精品| 日韩专区在线播放| 精品久久久久久中文字幕一区 | 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 亚洲精品影院久久久久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 精品久久久久久综合网| 欧美a免费| 亚洲天堂在线播放| 国产亚洲精品aaa大片| 九九精品久久久久久久久| 97视频免费在线| 日韩男人天堂| 日韩一级黄色| 尤物视频网站在线观看| 亚洲女人国产香蕉久久精品 | 精品久久久久久影院免费| 九九精品在线播放| 欧美一级视频免费| 精品国产三级a∨在线观看| 尤物视频网站在线| 欧美a级片视频| 久久国产影院| 91麻豆精品国产自产在线| 韩国妈妈的朋友在线播放| 欧美1卡一卡二卡三新区| 午夜精品国产自在现线拍| 亚洲精品久久久中文字| 二级特黄绝大片免费视频大片| 久久成人性色生活片| 欧美激情一区二区三区在线| 日韩免费在线观看视频| 色综合久久天天综线观看| 一本高清在线| 天天色色色| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品国产一区二区三区免费| 精品美女| 亚洲女人国产香蕉久久精品 | 国产不卡福利| 国产伦久视频免费观看 视频 | 国产伦精品一区二区三区无广告| 精品国产三级a∨在线观看| 国产91素人搭讪系列天堂| 亚洲第一页乱| 久久精品免视看国产明星| 日本在线www| 91麻豆国产级在线| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 |