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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

無(wú)法在 Mac OS X 上的 Go 1.5 中對(duì)超過(guò) 32768 字節(jié)的切片進(jìn)行 gzip

無(wú)法在 Mac OS X 上的 Go 1.5 中對(duì)超過(guò) 32768 字節(jié)的切片進(jìn)行 gzip

Go
函數(shù)式編程 2021-12-27 15:37:03
我正在嘗試使用compress/gzip. 每當(dāng)我在筆記本電腦上壓縮長(zhǎng)度超過(guò) 2^15 的切片時(shí),解壓后索引為 2^15 或更大的每個(gè)字節(jié)都設(shè)置為 0。當(dāng)我在我的研究集群上運(yùn)行相同的代碼時(shí),它也會(huì)中斷。調(diào)用go version我的筆記本電腦打?。? go versiongo version go1.5 darwin/amd64調(diào)用go version集群打?。? go versiongo version go1.3.3 linux/amd64下面是我寫(xiě)的一個(gè)演示測(cè)試文件。它生成不同長(zhǎng)度的隨機(jī)切片,壓縮它們,然后解壓縮它們。它檢查沒(méi)有調(diào)用返回錯(cuò)誤,并檢查壓縮和解壓縮的切片是否相同:package compressimport (    "bytes"    "compress/gzip"    "math/rand"    "testing")func byteSliceEq(xs, ys []byte) bool {    if len(xs) != len(ys) { return false }    for i := range xs {        if xs[i] != ys[i] { return false }    }    return true}func TestGzip(t *testing.T) {    tests := []struct {        n int    }{        { 1<<10 },        { 1<<15 },        { 1<<15 + 1 },        { 1<<20 },    }    rand.Seed(0)    for i := range tests {        n := tests[i].n        in, out := make([]byte, n), make([]byte, n)        buf := &bytes.Buffer{}        for i := range in { in[i] = byte(rand.Intn(256)) }        writer := gzip.NewWriter(buf)        _, err := writer.Write(in)        if err != nil {            t.Errorf("%d) n = %d: writer.Write() error: %s",                i + 1, n, err.Error())        }        err = writer.Close()        if err != nil {            t.Errorf("%d) n = %d: writer.Close() error: %s",                i + 1, n, err.Error())        }        reader, err := gzip.NewReader(buf)        if err != nil {            t.Errorf("%d) n = %d: gzip.NewReader error: %s",                i + 1, n, err.Error())        }        reader.Read(out)        err = reader.Close()        if err != nil {            t.Errorf("%d) n = %d: reader.Close() error: %s",                i + 1, n, err.Error())        }當(dāng)我運(yùn)行這個(gè)測(cè)試時(shí),我得到以下輸出:$ go test --run "TestGzip"--- FAIL: TestGzip (0.12s)    gzip_test.go:77: 3) n = 32769: in[32768] = 78, but out[32768] = 0    gzip_test.go:77: 4) n = 1048576: in[32768] = 229, but out[32768] = 0FAILexit status 1有誰(shuí)知道這里發(fā)生了什么?我是否以某種方式濫用了該軟件包?如果我沒(méi)有提供足夠的信息,請(qǐng)告訴我。
查看完整描述

1 回答

?
慕絲7291255

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

問(wèn)題出在這一行:


reader.Read(out)

不能保證一步Reader.Read()讀取整個(gè)out切片。


gzip.Reader.Read()是執(zhí)行io.Reader.Read()。

引用其文檔(“一般合同”):


Read(p []byte) (n int, err error)

Read 將最多l(xiāng)en(p) 個(gè)字節(jié)讀入 p。


不保證Reader.Read()會(huì)一直讀取直到out被填滿(mǎn),如果實(shí)現(xiàn)需要,它可能會(huì)在更少的字節(jié)處停止(即使沒(méi)有達(dá)到 EOF)。如果您傳遞“大”切片,則在實(shí)現(xiàn)的內(nèi)部緩存耗盡時(shí)很容易發(fā)生這種情況。Read()返回讀取的字節(jié)數(shù)(和error),您可以使用它來(lái)檢查是否讀取了完整的切片。


或者更好的是,您可以使用它io.ReadFull()來(lái)確保out已完全閱讀:


if _, err = io.ReadFull(reader, out); err != nil {

    t.Errorf("Error reading full out slice:", err)

}

通過(guò)應(yīng)用此更改,您的測(cè)試將通過(guò)。


查看完整回答
反對(duì) 回復(fù) 2021-12-27
  • 1 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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