go語言內置io包中TreeReader函數的理解和使用示例

? ? ? 在go語言的內置io包中的這個 TreeReader函數,函數原型?func TeeReader(r Reader, w Writer) Reader? ?從函數原型中看是給他一個Reader, 和一個Writer 然后他給你返回一個Reader,? 本文中我們把這個返回的Reader叫做 treeReader, 他是一個很特別的reader,。

????????他的作用就是將你輸入的 r 和w建立一個對應關系,?當你在讀取這個treeReader的時候,他會將讀取到的數據同時寫入到w中。同時在他的內部沒有緩存,寫入必須在讀取完成之前完成。寫入時遇到的任何錯誤都會報告為讀取錯誤。

? ? ?這個是官方的解釋: “?TeeReader returns a Reader that writes to w what it reads from r. All reads from r performed through it are matched with corresponding writes to w. There is no internal buffering - the write must complete before the read completes. Any error encountered while writing is reported as a read error. ”? ?對于非英語母語的人來說看起來是不是有點繞啊? 😆

? ? ? ? ? 知道了他的作用, 那我們就可以根據他的作用來給他找合適的用處了, 我們一般用它來統計文件下載進度, 還有計算文件的HASH值等。

? ? ? ?

先看看官方給的小示例

? 這里的用途是在讀取treeReader的時候同步將數據打印到標準輸出中。

package mainimport ("io""log""os""strings"
)func main() {var r io.Reader = strings.NewReader("some io.Reader stream to be read\n")r = io.TeeReader(r, os.Stdout)// Everything read from r will be copied to stdout.if _, err := io.ReadAll(r); err != nil {log.Fatal(err)}}

使用io.ReeeReader來計算文件的hash值 sha256 Example測試用例


func ExampleCalSha() {file, err := os.Open("testdata/test.zip")if err != nil {fmt.Println("error opening file: ", err)return}hash256 := sha256.New()treeReader := io.TeeReader(file, hash256)// 又拷貝回去io.Copy(file, treeReader) // 這個的意義就在于用它來從treeReader中讀取數據的同時寫入到hash256中b256 := hash256.Sum(nil)fmt.Printf("文件 %v SHA256: %X", file.Name(), b256) // output: a
}

使用io.TreeReader來實時顯示文件的下載進度

這個很簡單,我們只需要自定義一個Writer, 然后 利用TreeReader將下載文件的返回流 resp.Body和我們自定義的這個Writer建議對應關系, 然后我們再來讀取這treeReader的數據, 在我們呢讀取數據的時候也會同步的將數據發送到我們自定義的Writer中, 我們的下載進度顯示就在我們自定義的Writer中完成。? 我們可以使用? io.Copy(outfile, treeReader) 來從treeReader中讀取數據并拷貝到outfile輸出文件中。

自定義的用來顯示下載進度的Writer對象


// 自定義的用來統計和顯示下載進度的對象
type DownProgress struct {CLen  uint64 //數據的總長度Total uint64 // 用來記錄數據的總寫入長度
}// 注意,這個方法只有在treeReader中的數據被讀取之后才會被調用, 每讀一次這里調用一次
func (w *DownProgress) Write(b []byte) (int, error) {n := len(b) // number of bytes writtenw.Total += uint64(n)// 打印下載進度// 獲取當前下載進度百分比,需要將除數和被除數數據類型都轉為float64percent := float64(w.Total) / float64(w.CLen) * 100// 打印當前下載進度 注意這里的 %.2f 表示格式化浮點數 2位小數, 后面的 %% 表示在顯示一個百分號 %fmt.Printf("\r下載中...  已完成百分比 %.2f%% ", percent)// 打印下載進度 endreturn n, nil
}

自定義Writer的使用

    resp,err:=http.DefaultClient.Get("https://cn.bing.com/th?id=OHR.MPPUnesco_ZH-CN8076198158_UHD.jpg")if err != nil {fmt.Println("request error: ", err)return}defer resp.Body.Close()// 創建保存文件outfile, err := os.Create("abc.jpg")if err != nil {return err}defer outfile.Close()// 自定義一個用來統計下載進度的WriterdownProgress := &DownProgress{CLen: uint64(resp.ContentLength)} // 下載進度顯示對象, 這里利用io.TeeReader 將下載對象的數據和這個自定義的Writerd讀取進行綁定, 在treeReader讀取數據后會同步寫入到這個自定義的write中,用來統計下載進度.treeReader := io.TeeReader(resp.Body, downProgress) //將自定義的writer和resp.Body建立聯系io.Copy(outfile, treeReader) // 讀取數據

執行后即可見到你的下載進度從0%到 100%顯示
下載中... ?已完成百分比 100.00%?
?

還有其他的用法? 等待你的發現和探索。。。。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16638.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用STK分析雷達干擾

利用STK中的radar模塊能夠進行干擾分析。該模塊能夠用來確定干擾源(單站雷達、發射源),評估干擾對本機雷達性能的影響。 在分析干擾影響之前,首先設置一簡單場景。 1、創建一個名為RadarJam的場景; 2、打開場景的Prop…

上位機圖像處理和嵌入式模塊部署(f103 mcu運行freertos)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】 mcu一般有兩個用途,一個是控制,一個是非控制。控制類的應用一般要求實時性比較高,什么時候做什么,都是有嚴格的時間要求的。而非控制類的應用,則要求實現盡可能多的功能,比如…

spring boot整合j2cache 配置項目全局鍵標識 幫助定位是哪個項目產生的緩存

我們利用 j2cache 存進 redis的緩存 key 可以加個全局標識 這樣 到時看緩存 方便別人看是哪個項目存進去的 例如 這里 我們存入的 book 我們 keys * 查看 就知道是個book 但不知道具體來自那套系統 我們在 j2cache.properties 中加上 redis.namespace 項目全局鍵標識 我們…

技術分享:深入C++時間操作函數的應用與實踐

在軟件開發中,時間是無處不在的一個概念,無論是日志記錄、定時任務還是用戶界面,時間的處理都至關重要。C標準庫提供了一套完整的工具來幫助我們處理時間相關的操作。本文將詳細介紹幾個時間操作函數的使用場景、代碼實現以及它們在實際開發中…

42-5 應急響應之日志分析

一、Windows 系統日志排查 1)日志概述 在 Windows 2000 專業版、Windows XP 和 Windows Server 2003 中: 系統日志的位置為 C:\WINDOWS\System32\config\SysEvent.evt安全性日志的位置為 C:\WINDOWS\System32\config\SecEvent.evt應用程序日志的位置為 C:\WINNT\System32\c…

牛客周賽 Round 44VP

1.簽到&#xff1a;https://ac.nowcoder.com/acm/contest/82526/A AC代碼&#xff1a; #include<bits/stdc.h> using namespace std; int n; int main() {cin>>n;cout<<n/3; } 2.思維&#xff1a;https://ac.nowcoder.com/acm/contest/82526/B 就是判斷最…

【漏洞復現】海康威視綜合安防管理平臺 iSecure Center applyCT fastjson 遠程代碼執行

0x01 漏洞名稱 海康威視綜合安防管理平臺 iSecure Center applyCT fastjson 遠程代碼執行 0x02 漏洞影響 0x03 搜索引擎 app"HIKVISION-綜合安防管理平臺"0x04 漏洞詳情 POST /bic/ssoService/v1/applyCT HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Wi…

NASA數據集——阿爾法噴氣式大氣實驗二氧化碳和甲烷數據

Alpha Jet Atmospheric eXperiment Carbon Dioxide and Methane Data 阿爾法噴氣式大氣實驗二氧化碳和甲烷數據 簡介 Alpha Jet Atmospheric eXperiment (AJAX) 是美國國家航空航天局艾姆斯研究中心與 H211, L.L.C. 公司的合作項目&#xff0c;旨在促進對加利福尼亞、內華達…

Kafka 實戰 - Kafka Consumer 重置 Offset

在開發測試過程中&#xff0c;可能需要消費一段時間的消息&#xff0c;來驗證數據的可靠性&#xff0c;這里需要消費者&#xff08;Consumer&#xff09;重置其消費的偏移量&#xff08;Offset&#xff09;。 以下是幾種常用的方法來重置Kafka Consumer的Offset&#xff1a; …

vue+iview tabs context-menu 彈出框怎么修改樣式

今天遇到一個需求說頁面頂部的菜單右鍵彈出框離得有點遠 代碼是這樣 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

什么是容器:從基礎到進階的全面介紹

?? 歡迎大家來訪Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭?&#xff5e;?? &#x1f31f;&#x1f31f; 歡迎各位親愛的讀者&#xff0c;感謝你們抽出寶貴的時間來閱讀我的文章。 我是Srlua小謝&#xff0c;在這里我會分享我的知識和經驗。&am…

libjpeg_example.txt

/* 示例.txt該文件說明了如何使用IJG代碼作為子程序庫讀取或寫入JPEG圖像文件。你應該看看這段代碼與文檔文件 libjpeg.txt 結合使用。這段代碼按原樣不會做任何有用的事情&#xff0c;但它可能會有所幫助用于構建調用 JPEG 庫的例程的骨架。我們以 JPEG 代碼中使用的相同編碼…

Java中的內部類及其用途

一、技術難點 在Java中&#xff0c;內部類是一個定義在另一個類內部的類。這種嵌套的結構帶來了一些技術上的難點和挑戰&#xff1a; 訪問控制&#xff1a;內部類可以直接訪問外部類的所有成員&#xff08;包括私有成員&#xff09;&#xff0c;但外部類不能直接訪問內部類的…

Vue3實戰筆記(44)—vue3組件的ref屬性

文章目錄 前言一、組件的ref用法總結總結 前言 之前學習過ref聲明響應式對象&#xff0c;前幾天讀代碼遇到了發懵的地方&#xff0c;詳細學習了一下才發現&#xff0c;用法還有很多&#xff0c;遂總結一下ref的用法備忘。 一、組件的ref用法總結 Vue3 中的 ref 是一種創建響應…

【Linux 網絡】網絡基礎(三)(網絡層協議:IP 協議)

在復雜的網絡環境中確定一個合適的路徑。 一、TCP 與 IP 的關系 IP 層的核心作用是定位主機&#xff0c;具有將數據從主機 A 發送到主機 B 的能力&#xff0c;但是能力并不能保證一定能夠做到&#xff0c;所以這時就需要 TCP 起作用了&#xff0c;TCP 可以通過超時重傳、擁塞控…

【必備工具】gitee上傳-保姆級教程

目錄 1.gitee是什么 2.gitee怎么注冊 ?編輯 3.gitee怎么提交代碼 4.gitee的三板斧 Clone倉庫 Q&A 1. Gitee 只有三板斧嗎&#xff1f; 2. Git 教了&#xff0c;Gitee 上沒有綠點怎么辦&#xff1f; 3. 用戶名和密碼輸入錯誤怎么辦&#xff1f; 4. 操作時不小心…

【c++基礎】和諧分組

題目描述 s 班共有 n 名學生&#xff0c;按照學號從 1 到的順序每名學生的身高分別為 a[1],a[2]...a[n]。由于是新學期&#xff0c;s 班需要進行分組&#xff0c;分組的要求如下&#xff1a; 進行分組的組數不能超過 k。 每組的人的學號必須相鄰。 由于身高差過大的人分在同一…

wordpress主題給網站增加一個版權聲明區塊代碼分享

在數字化時代&#xff0c;網絡上的信息傳播變得越來越便捷&#xff0c;給人們生活和工作帶來了極大的便利。然而&#xff0c;在這個過程中也產生了很多版權問題。為了更好地保護自己的版權&#xff0c;許多網站開始在其網頁上添加版權聲明。本文將探討在網站上添加版權聲明的重…

Gitee的原理及應用詳解(二)

本系列文章簡介&#xff1a; Gitee是一款開源的代碼托管平臺&#xff0c;是國內最大的代碼托管平臺之一。它基于Git版本控制系統&#xff0c;提供了代碼托管、項目管理、協作開發、代碼審查等功能&#xff0c;方便團隊協作和項目管理。Gitee的出現&#xff0c;在國內的開發者社…