1 回答

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ò)。
- 1 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報(bào)