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

主頁 > 知識庫 > 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的深入理解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧美激情插| 亚洲视频中文字幕| 欧美高清一级片在线观看| 另类成人小视频在线| 日韩欧美中文字幕制服| 日韩av一区二区在线影视| 欧美男人的天堂一二区| 亚洲一区二区免费视频| 欧美在线观看视频一区二区| 亚洲综合免费观看高清在线观看| 91国产丝袜在线播放| 亚洲一区二区四区蜜桃| 欧美老女人在线| 精品一区二区三区欧美| 中文字幕av一区二区三区| 色哟哟日韩精品| 午夜一区二区三区在线观看| 欧美三区在线视频| 午夜久久久久久电影| 日韩视频一区二区在线观看| 国产乱码精品一区二区三区av | 香蕉久久夜色精品国产使用方法| 色999日韩国产欧美一区二区| 日日摸夜夜添夜夜添国产精品 | 久久影院午夜片一区| 成人一区二区三区视频| 亚洲成人一区二区在线观看| 久久久久亚洲蜜桃| 91国产丝袜在线播放| 青青青伊人色综合久久| 亚洲视频一二区| 精品久久久久久亚洲综合网| 成人av在线网| 日本系列欧美系列| 椎名由奈av一区二区三区| 日韩欧美亚洲一区二区| 91免费小视频| 国产在线麻豆精品观看| 午夜精品久久久久| 亚洲欧洲制服丝袜| 欧美激情一区三区| 日韩天堂在线观看| 欧美日韩视频不卡| 在线免费观看日本一区| 国产成人av影院| 卡一卡二国产精品 | 欧美图片一区二区三区| 国产传媒日韩欧美成人| 美国十次了思思久久精品导航| 亚洲色图在线看| 国产精品欧美经典| 国产午夜亚洲精品理论片色戒| 精品三级av在线| 日韩一区二区电影| 欧美精品色一区二区三区| 成人福利视频网站| 狠狠色丁香婷综合久久| 日本欧美一区二区在线观看| 夜夜精品浪潮av一区二区三区| 中文字幕一区二区三区四区不卡| 欧美mv日韩mv| 欧美成人一区二区| 精品成人佐山爱一区二区| 日韩欧美你懂的| 日韩精品中文字幕一区| 欧美成人一区二区三区在线观看| 欧美一区二区视频网站| 日韩视频一区在线观看| 精品久久一区二区三区| 国产午夜三级一区二区三| 国产精品国产自产拍在线| 国产精品久久久久影院| 亚洲日本韩国一区| 亚洲成人tv网| 久久爱另类一区二区小说| 国产一区二区三区免费观看| 国产馆精品极品| www.99精品| 99久久er热在这里只有精品66| 91麻豆成人久久精品二区三区| 欧亚一区二区三区| 日韩一级片在线观看| 欧美精品一区二区三区四区| 中文字幕第一区二区| 国产精品女同互慰在线看| 视频在线在亚洲| 日韩精品视频网站| 国产一区二区三区四区五区入口 | caoporn国产一区二区| 93久久精品日日躁夜夜躁欧美| 色综合久久中文综合久久97| 欧美日韩精品一区视频| 日韩免费视频一区二区| 国产精品乱码人人做人人爱 | 91蝌蚪porny九色| 欧美久久久久久久久中文字幕| 日韩欧美国产一区二区三区| 国产丝袜美腿一区二区三区| 亚洲愉拍自拍另类高清精品| 国产一区二三区| 色综合久久综合| 久久久久久一二三区| 一区二区三区日本| 大胆欧美人体老妇| 欧美大片在线观看一区| 又紧又大又爽精品一区二区| 国产一区二三区好的| 欧美三级电影网| 国产精品美女久久福利网站| 亚洲成a人片在线观看中文| 粉嫩av一区二区三区在线播放 | 日韩中文字幕av电影| 91丨porny丨首页| 久久影音资源网| 日韩福利视频网| 欧美在线free| 国产精品久久久久久久久快鸭| 蜜臀久久久99精品久久久久久| 色诱视频网站一区| 国产视频亚洲色图| 国产主播一区二区三区| 欧美日韩免费在线视频| 亚洲欧美aⅴ...| 99久久伊人精品| 欧美极品aⅴ影院| 国产精品 日产精品 欧美精品| 日韩一区国产二区欧美三区| 亚洲国产一区二区a毛片| 91啪亚洲精品| 亚洲欧美日韩在线不卡| 99久久精品一区二区| 国产精品系列在线| 丁香六月久久综合狠狠色| 26uuu精品一区二区在线观看| 老司机午夜精品99久久| 日韩精品中文字幕一区| 日本中文字幕一区二区视频| 91麻豆精品久久久久蜜臀| 奇米四色…亚洲| 日韩欧美国产精品一区| 久久机这里只有精品| 日韩精品一区二区三区四区视频| 全国精品久久少妇| 欧美日韩一级片在线观看| 午夜影院在线观看欧美| 91精品一区二区三区在线观看| 蜜臀av一区二区在线免费观看| 日韩欧美国产精品一区| 国产一区二区三区久久悠悠色av| 久久一区二区三区四区| 国产麻豆视频精品| 国产欧美精品在线观看| jiyouzz国产精品久久| 夜夜揉揉日日人人青青一国产精品| 91啪亚洲精品| 日韩一区在线看| 欧美久久免费观看| 国产一区二区三区在线观看免费视频 | 午夜精品免费在线| 日韩欧美自拍偷拍| 国产成人午夜电影网| 久久免费看少妇高潮| 成人黄色av电影| 日韩高清电影一区| 久久精品一二三| 91极品视觉盛宴| 蜜臀av一区二区| 国产精品高潮呻吟| 欧美一级片在线看| yourporn久久国产精品| 婷婷六月综合网| 国产人成一区二区三区影院| 在线观看av不卡| 国产一区二区看久久| 国产精品麻豆视频| 日韩欧美一区二区视频| 99精品国产91久久久久久| 日韩av一区二区三区四区| 2023国产精品| 欧美图区在线视频| 成人黄色在线视频| 精品一区二区三区免费| 亚洲综合在线第一页| 国产亚洲自拍一区| 日韩一区二区免费在线观看| 99re视频这里只有精品| 日韩国产高清在线| 亚洲天天做日日做天天谢日日欢| 欧美tickling挠脚心丨vk| 色婷婷av一区二区| 狠狠色狠狠色综合系列| 天天综合网天天综合色| 中文字幕av一区二区三区免费看| 欧美一区二区三区爱爱| 欧美三区免费完整视频在线观看| 国产一区 二区| 激情欧美日韩一区二区| 日本美女一区二区三区| 亚洲国产精品视频| 亚洲精品国产品国语在线app|