一、介紹go標(biāo)準(zhǔn)庫中的bufio
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、武強網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為武強等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
最近用golang寫了一個處理文件的腳本,由于其中涉及到了文件讀寫,開始使用golang中的 io 包,后來發(fā)現(xiàn)golang 中提供了一個bufio的包,使用這個包可以大幅提高文件讀寫的效率,于是在網(wǎng)上搜索同樣的文件讀寫為什么bufio 要比io 的讀寫更快速呢?根據(jù)網(wǎng)上的資料和閱讀源碼,以下來詳細解釋下bufio的高效如何實現(xiàn)的。
bufio 包介紹
bufio包實現(xiàn)了有緩沖的I/O。它包裝一個io.Reader或io.Writer接口對象,創(chuàng)建另一個也實現(xiàn)了該接口,且同時還提供了緩沖和一些文本I/O的幫助函數(shù)的對象。
以上為官方包的介紹,在其中我們能了解到的信息如下:
bufio 是通過緩沖來提高效率
簡單的說就是,把文件讀取進緩沖(內(nèi)存)之后再讀取的時候就可以避免文件系統(tǒng)的io 從而提高速度。同理,在進行寫操作時,先把文件寫入緩沖(內(nèi)存),然后由緩沖寫入文件系統(tǒng)??赐暌陨辖忉層腥丝赡軙硎纠Щ罅耍苯影?內(nèi)容-文件 和 內(nèi)容-緩沖-文件相比, 緩沖區(qū)好像沒有起到作用嘛。其實緩沖區(qū)的設(shè)計是為了存儲多次的寫入,最后一口氣把緩沖區(qū)內(nèi)容寫入文件。下面會詳細解釋
bufio 封裝了io.Reader或io.Writer接口對象,并創(chuàng)建另一個也實現(xiàn)了該接口的對象
io.Reader或io.Writer 接口實現(xiàn)read() 和 write() 方法,對于實現(xiàn)這個接口的對象都是可以使用這兩個方法的
注明:介紹內(nèi)容來自博主 LiangWenT
,原文鏈接: ,在查找資料時,發(fā)現(xiàn)這篇博客的內(nèi)容很好理解
bufio包實現(xiàn)了緩存IO。它包裝了io.Reader和io.Write對象,創(chuàng)建了另外的Reader和Writer對象,它們也實現(xiàn)了io.Reader和io.Write接口,具有緩存。注意:緩存是放在主存中,既然是保存在主存里,斷電會丟失數(shù)據(jù),那么要及時保存數(shù)據(jù)。
二、常用內(nèi)容
1、Reader類型
NewReaderSize
作用:NewReaderSize將rd封裝成一個帶緩存的bufio.Reader對象。緩存大小由size指定(如果小于16則會被設(shè)為16)。如果rd的基類型就是有足夠緩存的bufio.Reader類型,則直接將rd轉(zhuǎn)換為基類型返回。
NewReader
funcReader相當(dāng)于NewReaderSize(rd, 4096)
Peek
Peek返回緩存的一個切片,該切片引用緩存中前n個字節(jié)的數(shù)據(jù),該操作不會將數(shù)據(jù)讀出,只是引用,引用的數(shù)據(jù)在下一次讀取操作之前有效的。如果切片長度小于n,則返回一個錯誤信息說明原因。如果n大于緩存的總大小,則返回ErrBufferFull。
Read
Read從b中數(shù)據(jù)到p中,返回讀出的字節(jié)數(shù)和遇到的錯誤。如果緩存不為空,則只能讀出緩沖中的數(shù)據(jù),不會從底層io.Reader中提取數(shù)據(jù),如果緩存為空,則:
1、len(p) = 緩存大小,則跳過緩存,直接從底層io.Reader中讀出到p中
2、len(p) 緩存大小,則先將數(shù)據(jù)從底層io.Reader中讀取到緩存中,再從緩存讀取到p中。
Buffered
Buffered返回緩存中未讀取的數(shù)據(jù)的長度。
Discard
Discard跳過后續(xù)的n個字節(jié)的數(shù)據(jù),返回跳過的字節(jié)數(shù)。
Writer類型和方法
write結(jié)構(gòu)
NewWriteSize
NewWriterSize將wr封裝成一個帶緩存的bufio.Writer對象,緩存大小由size指定(如果小于4096則會被設(shè)置未4096)。
NewWrite
NewWriter相等于NewWriterSize(wr, 4096)
WriteString
WriteString功能同Write,只不過寫入的是字符串
WriteRune
WriteRune向b寫入r的UTF-8編碼,返回r的編碼長度。
Flush
Available
Available 返回緩存中未使用的空間的長度
Buffered
Buffered返回緩存中未提交的數(shù)據(jù)長度
Reset
Reset將b的底層Write重新指定為w,同時丟棄緩存中的所有數(shù)據(jù),復(fù)位所有標(biāo)記和錯誤信息。相當(dāng)于創(chuàng)建了一個新的bufio.Writer。
GO中還提供了Scanner類型,處理一些比較簡單的場景。如處理按行讀取輸入序列或空格分隔的詞等。
內(nèi)容來自:
參考鏈接:
1)
2)
先看一下目錄結(jié)構(gòu),注意這里的src名稱是必須的,go在設(shè)置了GOPATH后,默認會添加src去尋找package,暫未查詢是否有方法不按照src查詢
根據(jù)上面的描述,Go語言中通過包中函數(shù)的名稱來區(qū)分公共函數(shù)和私有函數(shù),我們在main函數(shù)中是無法調(diào)用myPrivateFunc的
此時如果執(zhí)行通過go run方式執(zhí)行,會看到如下的提示信息,這與大部分語言對于包管理方式相關(guān),所以我們通過兩種不同的方法來讓代碼執(zhí)行起來
返回如下,這里面對我們后續(xù)執(zhí)行有影響的兩個參數(shù)GO111MODULE和GOPATH
如果要使用gopath模式引用包,則需要關(guān)閉mod模式
設(shè)置GOPATH為當(dāng)前路徑,即main.go所在的路徑
此時再查看go env時,GOPATH已經(jīng)發(fā)生改變
我們再次嘗試執(zhí)行代碼
可以看到public函數(shù)被調(diào)用
你需要設(shè)置 GOPATH 環(huán)境變量
你 main.go 中需要 import 相應(yīng)包
你 調(diào)用處需要帶上包前綴,比如 tempconv.FToC
⑴ Go Kit
它本身不是一個框架,而是一套微服務(wù)工具集,可以用于解決分布式系統(tǒng)開發(fā)中的大多數(shù)常見問題,所以使用者可以專注于你的業(yè)務(wù)邏輯中。
⑵ Gingko
是一個Go測試框架,目的是幫助我們使用行為驅(qū)動開發(fā)風(fēng)格高效地編寫富有表現(xiàn)力和全面的測試,它有著非常良好的幫助文檔,任何人都可以輕松地在項目中集成使用它。
⑶ NSQ
實時分布式消息傳遞平臺,提供高可用性和可靠的消息傳遞保證,可以水平擴展,支持負載均衡,安裝部署非常方便。
⑷ Goose
Golang中最佳的數(shù)據(jù)庫遷移包,通過創(chuàng)建增量SQL更改和Go函數(shù)來管理數(shù)據(jù)庫結(jié)構(gòu),在Go1.16版本以上,還支持了嵌入式sql遷移。
⑸ GORM
是一個功能齊全的Golang對象關(guān)系映射庫,是一種開發(fā)人員友好的工具,用于在不兼容的類型系統(tǒng)之間轉(zhuǎn)換數(shù)據(jù),專門設(shè)計用于在類型系統(tǒng)之間切換時最大限度地減少重寫代碼。
⑹ Authboss
一個模塊化的身份驗證包,使用它你可以快速地在項目中進行身份驗證管理。它有幾個常見的身份驗證和授權(quán)模塊供開發(fā)人員選擇。
⑺ cli
是一個簡單快捷的命令行管理包,用于為Go語言構(gòu)建命令行應(yīng)用程序,允許開發(fā)人員開發(fā)自己的富有表現(xiàn)力的命令行應(yīng)用程序,用于創(chuàng)建標(biāo)志、bash完成例程并生成幫助文本。
⑻ Vegeta
是一個用于HTTP負載測試的工具包,這個多功能工具專為測試具有恒定請求率的HTTP服務(wù)而設(shè)計。它可以有效地分析程序中的潛在問題,是一個始終貫穿以提高整體性能為目的的包。