精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Go 中如何將 [][]byte 轉(zhuǎn)為 io.Reader ?

開(kāi)發(fā) 前端
我們需要一個(gè)構(gòu)造函數(shù)?NewMultiBytes?來(lái)創(chuàng)建?MultiBytes?對(duì)象。其次,則要實(shí)現(xiàn)?io.Reader?接口。最后,我們也可以順便實(shí)現(xiàn)一下?io.Write?接口。

起因:在春節(jié)前的某一天,我在 ekit 項(xiàng)目的交流群里看到大明老師發(fā)了這樣一條消息:

各位大佬,問(wèn)個(gè)小問(wèn)題,有咩有誰(shuí)用過(guò) [][]byte 轉(zhuǎn)為 io.Reader 的東西?我以前搞過(guò)一次,但是我忘了是我手搓了一個(gè)實(shí)現(xiàn),還是用的開(kāi)源的,還是SDK 自帶的。

并且大明老師還為此開(kāi)了一個(gè) issue。

看到這條消息,我想起了我在對(duì) Go 還不太熟悉時(shí),曾寫(xiě)過(guò)一個(gè) io.MultiReader 的實(shí)現(xiàn)(當(dāng)時(shí)寫(xiě)完了我才知道原來(lái) Go 中自帶了 io.MultiReader),想必應(yīng)該有相似之處,于是就嘗試寫(xiě)了一個(gè)出來(lái)。

不過(guò),當(dāng)我寫(xiě)完時(shí)發(fā)現(xiàn)已經(jīng)有人提交了代碼,于是我就沒(méi)把它當(dāng)回事,也沒(méi)有寫(xiě)測(cè)試代碼進(jìn)行測(cè)試,就放一邊了。春節(jié)假期閑來(lái)無(wú)事,我忽然想起來(lái)這件事,就看了下對(duì)應(yīng)的 pr,發(fā)現(xiàn)提交 pr 的作者和我的實(shí)現(xiàn)思路不太一樣。不過(guò),雖然這個(gè)功能很小,既然我也實(shí)現(xiàn)了,就補(bǔ)齊下單元測(cè)試,發(fā)出來(lái)供參考,順便寫(xiě)(水)一篇文章 :)。

思路設(shè)計(jì)

首先我設(shè)計(jì)了如下結(jié)構(gòu)體:

type MultiBytes struct {
 data  [][]byte // 存儲(chǔ)數(shù)據(jù)的嵌套切片
 index int      // 當(dāng)前讀/寫(xiě)到的外層切片索引,data[index]
 pos   int      // 當(dāng)前讀/寫(xiě)到的切片所處理到的位置下標(biāo),data[index][pos]
}

有了這個(gè)結(jié)構(gòu)體,那么就可以設(shè)計(jì) MultiBytes 的整體實(shí)現(xiàn)思路了。

首先,我們需要一個(gè)構(gòu)造函數(shù) NewMultiBytes 來(lái)創(chuàng)建 MultiBytes 對(duì)象。其次,則要實(shí)現(xiàn) io.Reader 接口。最后,我們也可以順便實(shí)現(xiàn)一下 io.Write 接口。

MultiBytes 支持的函數(shù)和方法設(shè)計(jì)如下:

type MultiBytes
    func NewMultiBytes(data [][]byte) *MultiBytes
    func (b *MultiBytes) Read(p []byte) (int, error)
    func (b *MultiBytes) Write(p []byte) (int, error)

基于此,我為每個(gè)方法畫(huà)了一個(gè)流程圖,你可以參考下:

圖片圖片

流程圖中包含了每個(gè)方法內(nèi)部的主體邏輯。

代碼實(shí)現(xiàn)

既然有了結(jié)構(gòu)體和方法簽名,那么就可以依次實(shí)現(xiàn)所有方法了。

首先是構(gòu)造函數(shù) NewMultiBytes 的實(shí)現(xiàn):


https://github.com/jianghushinian/blog-go-example/blob/main/iox/multi_bytes.go

// NewMultiBytes 構(gòu)造一個(gè) MultiBytes
func NewMultiBytes(data [][]byte) *MultiBytes {
 return &MultiBytes{
  data: data,
 }
}

這沒(méi)什么好說(shuō)的,就是根據(jù)給定的 data 初始化了一個(gè) *MultiBytes 對(duì)象,index 和 pod 都為默認(rèn)值 0。

接著是 Read 方法的實(shí)現(xiàn):

// Read 實(shí)現(xiàn) io.Reader 接口,從 data 中讀取數(shù)據(jù)到 p
func (b *MultiBytes) Read(p []byte) (int, error) {
 // 如果 p 是空的,直接返回
 if len(p) == 0 {
   return 0, nil
 }

 // 所有數(shù)據(jù)都已讀完
 if b.index >= len(b.data) {
   return 0, io.EOF
 }

 n := 0// 記錄已讀取的字節(jié)數(shù)

 for n < len(p) {
   // 如果當(dāng)前切片已經(jīng)讀完,則切換到下一個(gè)切片
   if b.pos >= len(b.data[b.index]) {
     b.index++
     b.pos = 0
     // 如果所有切片都已讀完,退出循環(huán)
     if b.index >= len(b.data) {
       break
     }
   }

  // 從當(dāng)前切片讀取數(shù)據(jù)
  bytes := b.data[b.index]
  cnt := copy(p[n:], bytes[b.pos:])
  b.pos += cnt
  n += cnt
 }

 // 未讀取到數(shù)據(jù)且已經(jīng)讀到結(jié)尾
 if n == 0 {
   return 0, io.EOF
 }

 return n, nil
}

Read 方法就是按照流程圖中的整體脈絡(luò)實(shí)現(xiàn)的。需要強(qiáng)調(diào)的一點(diǎn)是,程序最后還有一個(gè) if n == 0 的判斷,如果成立,返回 io.EOF。這是為了處理 data 中嵌套的內(nèi)部切片為空的情況,比如當(dāng) data 值為 [][]byte{[]byte{}} 這種情況時(shí),程序就會(huì)走到這個(gè)分支。

然后是 Write 方法的實(shí)現(xiàn):

// Write 實(shí)現(xiàn) io.Writer 接口,將數(shù)據(jù)追加到 data 中
func (b *MultiBytes) Write(p []byte) (int, error) {
 // 如果 p 是空的,直接返回
 if len(p) == 0 {
  return 0, nil
 }

 // 創(chuàng)建副本以避免外部修改影響數(shù)據(jù)
 clone := make([]byte, len(p))
 copy(clone, p)
 b.data = append(b.data, clone)
 return len(p), nil
}

值得注意的是,在 Write 方法實(shí)現(xiàn)中,對(duì) p 進(jìn)行了拷貝,生成新的副本,目的是防止用戶在調(diào)用 Write(p) 以后,隨意修改 p 的值而影響 MultiBytes 對(duì)象內(nèi)部的 data。

最后,如果你不嫌麻煩,還可以增加如下兩行代碼,以檢查 MultiBytes 是否實(shí)現(xiàn)了  io.Reader 和 io.Write 接口:

var _ io.Reader = (*MultiBytes)(nil)
var _ io.Writer = (*MultiBytes)(nil)

至此,能夠?qū)?nbsp;[][]byte 轉(zhuǎn)為 io.Reader 的 MultiBytes 實(shí)現(xiàn)完成。

我們可以簡(jiǎn)單測(cè)試一下效果。

示例代碼:

https://github.com/jianghushinian/blog-go-example/blob/main/iox/examples/multi_bytes.go

package main

import (
"fmt"

"github.com/jianghushinian/blog-go-example/iox"
)

func main() {
 mb := iox.NewMultiBytes([][]byte{[]byte("Hello, World!\n")})
 _, _ = mb.Write([]byte("你好,世界!"))
 p := make([]byte, 32)
 _, _ = mb.Read(p)
 fmt.Println(string(p))
}

執(zhí)行示例代碼,得到輸出如下:

$ go run examples/multi_bytes.go
Hello, World!
你好,世界!

總結(jié)

本文帶大家實(shí)現(xiàn)了一個(gè)能夠?qū)?nbsp;[][]byte 轉(zhuǎn)為 io.Reader 的 MultiBytes,代碼邏輯并不復(fù)雜,不過(guò)一些細(xì)節(jié)還是需要注意。

你還可以點(diǎn)擊這里 https://github.com/jianghushinian/blog-go-example/blob/main/iox/multi_bytes_test.go 查看更多的單元測(cè)試,如果你在使用過(guò)程中,發(fā)現(xiàn)任何 bug,歡迎交流。

本文示例源碼我都放在了 GitHub 中,歡迎點(diǎn)擊查看。

希望此文能對(duì)你有所啟發(fā)。

延伸閱讀

本文轉(zhuǎn)載自微信公眾號(hào)「 Go編程世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 Go編程世界公眾號(hào)。


責(zé)任編輯:武曉燕 來(lái)源: Go編程世界
相關(guān)推薦

2021-12-29 07:56:32

Go byte io.Reader

2024-07-09 08:07:37

Go性能工具

2025-09-28 09:04:29

Go 語(yǔ)言IOReader

2021-12-08 13:55:36

GoJPEG JFIF

2022-10-20 08:59:18

Go接口類型

2021-02-01 06:39:42

模塊封裝庫(kù)

2019-07-15 10:00:53

DockerJava容器

2019-07-15 16:00:24

Docker架構(gòu)容器

2023-08-28 17:16:51

Golangio 包

2009-11-06 13:40:30

Silverlight

2021-12-29 16:40:54

Python語(yǔ)言字符串

2009-06-29 17:07:54

EJB部署Jboss

2023-12-29 07:04:28

Go項(xiàng)目Docker編寫(xiě)

2023-08-07 09:18:32

Golang偏移量接口

2024-03-19 14:15:48

Go程序os.Exit()

2023-11-07 09:02:07

Golangbytes

2021-09-14 14:50:05

SASTDevSecOps應(yīng)用安全

2021-03-15 13:05:13

LinuxNautilusGit

2022-11-25 16:27:07

應(yīng)用開(kāi)發(fā)鴻蒙

2021-09-11 22:32:26

Go 綁定 Host
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

天堂av在线播放| 久久精品视频国产| 永久免费观看精品视频| 亚洲免费在线观看| 久久综合狠狠综合久久综青草| 久久久精品视频网站| 色综合久久一区二区三区| 日韩欧美电影在线| 老头吃奶性行交视频| aa在线视频| 国产欧美日本一区二区三区| 999国产在线| 国语对白做受69按摩| 国内综合精品午夜久久资源| 国产亚洲欧美aaaa| 性农村xxxxx小树林| 成人免费一区| 欧美日韩免费在线观看| 色乱码一区二区三区熟女| 日韩电影免费| 成人综合婷婷国产精品久久| 国产精品专区h在线观看| 日本免费观看视| 综合五月婷婷| 色诱女教师一区二区三区| 性欧美丰满熟妇xxxx性久久久| 欧美v亚洲v综合v国产v仙踪林| 天天综合网 天天综合色| 影音先锋男人的网站| 成人不用播放器| 91蜜桃网址入口| 国产精品日韩一区二区| japanese国产| 开心九九激情九九欧美日韩精美视频电影 | av中字幕久久| 日韩国产在线看| 人妻av一区二区| 欧美不卡在线观看| 7799精品视频| 一级片视频免费观看| 成人性生活视频| 午夜影院久久久| 337p亚洲精品色噜噜狠狠p| 免费观看久久久久| 亚洲国产成人一区二区三区| 日本一区二区三区视频在线观看| 香蕉视频911| 91天堂素人约啪| 精品国产一区二区三区免费 | 一区二区三区视频在线| www.av欧美| 色综合中文网| 亚洲图片在线综合| 日韩视频在线观看免费视频| 国产中文字幕一区二区三区 | 风间由美久久久| 99精品人妻无码专区在线视频区| 狠狠色丁香久久婷婷综合丁香| 国产欧美日韩亚洲精品| 97人妻精品一区二区三区软件| 蜜臀av一级做a爰片久久| 国产精品免费福利| 伊人久久久久久久久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国内精品久久久久久久久电影网| 国产一区二区三区欧美| 欧美xxxx精品| 中文视频一区| 久久久综合av| 97久久久久久久| 人人狠狠综合久久亚洲| 成人精品一区二区三区电影黑人 | 欧美成人免费全部网站| 91麻豆精品国产自产在线| 久久久久99人妻一区二区三区 | 日韩av电影免费在线观看| 成人高清网站| 依依成人精品视频| www..com日韩| 澳门av一区二区三区| 欧美日韩一区二区在线视频| 久久综合在线观看| 欧美成人基地| 色婷婷综合久久久久| 免费一级片视频| 久久最新视频| 亚洲xxx大片| 天堂中文在线资| 国产精品女同互慰在线看| 成人污网站在线观看| 国产白浆在线免费观看| 欧美日韩一区二区三区四区五区| 亚洲视频在线不卡| 久久99影视| 欧美xxxx做受欧美| 亚洲欧美一区二区三区在线观看| 精品影院一区二区久久久| 国产伦精品一区二区三区高清版| 成黄免费在线| 五月婷婷久久丁香| 日本不卡一区二区在线观看| 久久婷婷国产| 久久精品精品电影网| 99久久精品国产亚洲| 激情六月婷婷久久| 青青草原亚洲| 国产91足控脚交在线观看| 欧美曰成人黄网| 免费黄色三级网站| 亚洲国产精品综合久久久| 欧美在线观看网址综合| www.五月婷| 国产精品入口麻豆原神| 激情五月宗合网| 欧美午夜网站| 色老头一区二区三区在线观看| 天天操天天干视频| 国产激情一区二区三区四区| 亚洲二区三区四区| 欧美人体一区二区三区| 精品日韩在线观看| www欧美com| 日本特黄久久久高潮| 久久亚洲综合网| 日本无删减在线| 91精品国产乱码| 国产精品久久久久久成人| 亚洲欧美日韩国产综合精品二区| 国产成人精品免费视频大全最热| 91精品国产综合久久久久久豆腐| 欧美性猛交xxxx黑人| 折磨小男生性器羞耻的故事| 中文一区一区三区免费在线观看| 国产精品一区二区三区免费视频| 国产在线高清| 91精品福利视频| 在线观看福利片| 奶水喷射视频一区| 国产精品一区二区三区在线观| av片在线观看免费| 在线不卡a资源高清| 日韩av片在线| 日本91福利区| 亚洲国产精品综合| 国产精品久久久久77777丨| 一本一道久久a久久精品逆3p| 成人公开免费视频| 国产亚洲短视频| 性欧美极品xxxx欧美一区二区| 久久不见久久见国语| 国产999精品久久久| 黄色片在线看| 欧美日韩在线一区二区| 精品一区二区三孕妇视频| 奇米一区二区三区| 一区二区免费电影| 91精品国产一区二区在线观看 | 国产又粗又硬又长又爽| 激情综合色丁香一区二区| 在线视频福利一区| 欧美一级片网址| 欧美激情免费看| 天堂成人在线| 在线欧美日韩精品| 亚洲欧美综合7777色婷婷| 国产精品自拍网站| 免费毛片网站在线观看| 久草在线成人| 成人精品一区二区三区电影黑人| av网站网址在线观看| 欧美mv日韩mv| 一级黄色大片视频| 中文字幕精品—区二区四季| 青青操视频在线播放| 日本久久一二三四| 91精品久久久久久久久青青| 99热国产在线中文| 亚洲国产精品成人av| 狠狠人妻久久久久久| 国产精品美女久久久久久久久久久| 想看黄色一级片| 国产日韩欧美一区| 亚洲图片小说在线| 成人在线超碰| 国产精品久久久久999| 18在线观看的| 亚洲天堂久久av| 国产理论片在线观看| 亚洲成av人片在线| 亚洲激情图片网| 成人免费视频免费观看| 黑森林精品导航| 欧美日韩天堂| 婷婷精品国产一区二区三区日韩| 麻豆精品久久| 国产精品ⅴa在线观看h| 日本孕妇大胆孕交无码| 国产一区二区激情| 蜜桃视频在线观看www| 欧美日韩在线直播| 久久中文字幕免费| 亚洲精品欧美在线| 手机毛片在线观看| 91最新地址在线播放| 日韩a一级欧美一级| 免费看的黄色欧美网站| 国产成人一二三区| 日韩欧美视频专区| 精品福利影视| 日韩在线亚洲| 国产日韩在线看片| 都市激情亚洲综合| 久久久久久久国产精品| 精品孕妇一区二区三区| 亚洲欧美激情另类校园| 欧美77777| 日韩欧美国产1| 国产又粗又猛又黄又爽| 欧美伊人久久久久久久久影院| 国产精品6666| 亚洲一二三四区| 永久久久久久久| 国产精品久久久久久久久免费樱桃 | 国产成人精品一区二区色戒| 精品久久久中文| 久久无码精品丰满人妻| 一区二区三区在线视频免费| 日韩av网站在线播放| 中文欧美字幕免费| 欧美午夜激情影院| 国产日韩欧美一区二区三区乱码 | 91免费的视频在线播放| 国产亚洲欧美日韩精品一区二区三区| 97在线观看视频国产| 蜜臀av国内免费精品久久久夜夜| 另类天堂视频在线观看| 毛片网站在线免费观看| 综合网中文字幕| av在线播放网站| 国产一区二区三区在线免费观看 | 国产福利视频在线播放| 亚洲欧美日韩视频二区| 国产二区视频在线播放| 亚洲专区一区| 久久久久久久久久久久久国产精品 | 国产日韩欧美一区二区三区乱码| 免费看污片网站| 久久精品亚洲精品国产欧美| 在线观看国产精品一区| 国产欧美一区二区精品忘忧草| 国产全是老熟女太爽了| 久久久久成人黄色影片| 一级黄色片网址| 国产精品色眯眯| 永久免费看mv网站入口| 亚洲欧洲色图综合| 日本中文字幕免费在线观看| 亚洲情趣在线观看| 国产一级生活片| 狠狠综合久久av一区二区小说| 波多野结衣视频网站| 日本高清免费不卡视频| 亚洲精品国产精品乱码视色| 欧美日韩国产色站一区二区三区| 国产精选久久久| 亚洲成人aaa| 青青色在线视频| 在线日韩av观看| xvideos国产在线视频| 高清欧美性猛交| 电影网一区二区| 国产日韩欧美电影在线观看| 欧美日本三级| 美日韩免费视频| 99成人在线视频| 国产一线二线三线女| 香蕉成人久久| 天天摸天天舔天天操| 国产**成人网毛片九色| 丰满少妇高潮一区二区| 亚洲精品日产精品乱码不卡| www亚洲视频| 欧美一区二区三区免费视频 | 69精品国产久热在线观看| 精品免费国产| 欧美激情偷拍自拍| 国产真实老熟女无套内射| 三级在线观看一区二区| 欧美高清精品一区二区| 久久久久国产成人精品亚洲午夜| 国产精品免费人成网站酒店| 天天色天天操综合| 国产精品女同一区二区| 亚洲精选一区二区| 国产在线看片| 国产国语刺激对白av不卡| 亚洲国产中文在线| 无遮挡亚洲一区| 亚洲午夜极品| 亚洲国产成人va在线观看麻豆| gogo大胆日本视频一区| 成人无码精品1区2区3区免费看 | 九九久久久久99精品| se01亚洲视频| 国产一区二区三区高清视频| 99久久视频| 精品少妇无遮挡毛片| 成人黄色777网| www.色小姐com| 欧美日韩在线播放三区四区| 头脑特工队2在线播放| 欧美人与性动交| 日韩毛片免费看| 涩涩日韩在线| 久久福利影视| 一级欧美一级日韩片| 一区二区三区在线观看欧美| 自拍偷拍第八页| 亚洲视频在线观看| 黄色在线免费观看网站| 高清不卡日本v二区在线| 天堂美国久久| 午夜两性免费视频| 国产婷婷色一区二区三区四区| 国产精品成人久久| 日韩欧美中文字幕一区| 久久99精品久久久久久野外| 国产精品入口免费视频一| 视频一区中文| 激情婷婷综合网| 久久嫩草精品久久久久| 精品美女久久久久| 日韩国产精品一区| 松下纱荣子在线观看| 国产伦精品一区二区三区高清版| 亚洲欧美综合国产精品一区| www.污网站| 成人免费在线视频| 国产精品久久影视| 久久香蕉频线观| 日本99精品| 久久这里只有精品8| 福利91精品一区二区三区| 九九视频在线观看| 精品国产一区二区三区不卡| 国产www视频在线观看| 国产一区二区三区黄| 日韩视频不卡| 亚洲一级中文字幕| 欧美性感一区二区三区| 在线观看美女网站大全免费| 成人有码视频在线播放| 欧美激情第8页| 中国一级特黄录像播放| 欧美日韩国产在线看| 男同在线观看| 成人黄色免费网站在线观看| 牛牛国产精品| 国产夫妻性爱视频| 色婷婷av一区| 久操视频在线观看| 99视频在线播放| 国产午夜精品一区二区三区欧美 | 欧美日韩国内自拍| 韩国三级在线观看久| 成人午夜黄色影院| 在线播放精品| 蜜桃无码一区二区三区| 欧美日韩国产成人在线免费| 污污视频在线| 欧美影视一区二区| 狠狠色丁香婷婷综合久久片| 日本一区二区不卡在线| 国产一区二区激情| 亚洲一区二区三区在线免费| www一区二区www免费| 国产精品麻豆视频| 亚洲第一页视频| 国产福利视频一区二区| 欧美日韩一区二区国产| 欧美做受xxxxxⅹ性视频| 欧美人与禽zozo性伦| 成年人国产在线观看| 色综合666| 国产a精品视频| 波多野结衣毛片| 欧美—级高清免费播放| 波多野结衣在线播放一区| 人妻少妇偷人精品久久久任期| 色婷婷av一区二区三区大白胸| 综合久久2o19| 日本在线视频一区| 北条麻妃一区二区三区| 中文字幕观看视频| 高清欧美性猛交xxxx黑人猛交| 婷婷精品进入| 欧美成人国产精品一区二区| 欧美精品一区二区三区很污很色的 | 欧美日韩激情网| 韩国中文字幕在线|