2016-09-30 84 views
-2

最近我用golang Read(p []byte),打算完整閱讀len(p)字節。但是我發現Read不保證讀取len(p)字節。那就是,我需要讀取4個字節,但實際上它只給出了1個。最後我用io.ReadFull代替。golang Read(p []字節)不讀全字節?

現在我很困惑,函數的含義是什麼?使用Read的適當場景是什麼?它可能只讀取比您需要的更少的字節。

+1

是的,這正是文檔的狀態。看看整個stdlib中如何使用Read,你不確定。 – Volker

回答

0

如果您檢查文檔和源代碼,您會明白爲什麼bufio.Read(p []byte)不能保證將數據完全讀入p Reader

將數據讀入p。它返回讀入p的字節數。 字節取自最多一個讀取底層讀取器, 因此n可能小於len(p)。

從源代碼複製,在函數的末尾有一個copy操作,其中緩衝區被複制到字節數組中。但這並不能保證全部數據都被複制。

// copy as much as we can 
n = copy(p, b.buf[b.r:b.w]) // => this line is important 
b.r += n 
b.lastByte = int(b.buf[b.r-1]) 
b.lastRuneSize = -1 
return n, nil 

如果你想複製全長字節使用bufio.ReadBytes而是使用EOFEOL分隔符爲參數,這取決於你的使用情況。