第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 defer 中關(guān)閉 gzip writer 會導(dǎo)致數(shù)據(jù)丟失

在 defer 中關(guān)閉 gzip writer 會導(dǎo)致數(shù)據(jù)丟失

Go
素胚勾勒不出你 2022-05-23 16:56:34
我使用 golanggzip.NewWriter壓縮切片,并defer Close()關(guān)閉 writer。但是當(dāng)從壓縮數(shù)據(jù)中讀取時,它會返回unexpected EOF. 代碼是:func main() {    a := []byte{'a', 'b', 'c', 'd', 'e', 'f'}    zippedData, err := zipData(a)    if err != nil {        panic(err)    }    unzippedData, err := unzipData(zippedData)    if err != nil {        panic(err)    }    fmt.Printf("%v\n", unzippedData)}壓縮功能是:func zipData(originData []byte) ([]byte, error) {    var bf bytes.Buffer    gw := gzip.NewWriter(&bf)    defer gw.Close()    _, err := gw.Write(originData)    if err != nil {        return nil, errors.New(fmt.Sprintf("gzip data err: %v", err))    }    err = gw.Flush()    if err != nil {        return nil, err    }    // if I rm 'defer gw.Close()' and call 'gw.Close()' here, it'll be ok    logs.Debug("before gzip len: %v", len(originData))    logs.Debug("gzip len: %v", bf.Len())    return bf.Bytes(), nil}上面的 zip 函數(shù)用于defer gw.Close()關(guān)閉 gw。解壓函數(shù)為:func unzipData(zippedData []byte) ([]byte, error) {    dst := make([]byte, len(zippedData))    copy(dst, zippedData)    reader, err := gzip.NewReader(bytes.NewBuffer(dst))    if err != nil {        return nil, errors.New(fmt.Sprintf("unzip err :%v", err))    }    defer reader.Close()    data, err := ioutil.ReadAll(reader)    if err != nil {        return nil, errors.New(fmt.Sprintf("read err :%v", err))    }    return data, err}為什么要defer gw.Close()案例unexpected EOF?
查看完整描述

2 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個贊

使用 defer,您會丟失 gzip 頁腳。根據(jù)Close文檔:

Close 通過將任何未寫入的數(shù)據(jù)刷新到底層 io.Writer 并寫入 GZIP 頁腳來關(guān)閉 Writer。它不會關(guān)閉底層的 io.Writer。

因此,即使Flush刷新任何緩沖數(shù)據(jù),它也不會寫入頁腳。通過延遲關(guān)閉,您將獲得不包含頁腳的字節(jié)數(shù)組并將其返回,然后將頁腳寫入輸出。

在返回之前關(guān)閉 writer。


查看完整回答
反對 回復(fù) 2022-05-23
?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊

With defer,在 return 語句中gw.Close()的調(diào)用之后運(yùn)行。bf.Bytes()為了確保返回完整的內(nèi)容,您應(yīng)該gw.Close在嘗試從緩沖區(qū)讀取字節(jié)之前顯式調(diào)用。

最簡單的代碼修復(fù)方法是將Flush調(diào)用替換為Close調(diào)用。Flush是在你沒有寫完的時候,但在你的情況下你已經(jīng)完成了壓縮,所以調(diào)用Close應(yīng)該就足夠了。



查看完整回答
反對 回復(fù) 2022-05-23
  • 2 回答
  • 0 關(guān)注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號