-2
最近我用golang Read(p []byte)
,打算完整閱讀len(p)
字節。但是我發現Read
不保證讀取len(p)
字節。那就是,我需要讀取4個字節,但實際上它只給出了1個。最後我用io.ReadFull
代替。golang Read(p []字節)不讀全字節?
現在我很困惑,函數的含義是什麼?使用Read的適當場景是什麼?它可能只讀取比您需要的更少的字節。
最近我用golang Read(p []byte)
,打算完整閱讀len(p)
字節。但是我發現Read
不保證讀取len(p)
字節。那就是,我需要讀取4個字節,但實際上它只給出了1個。最後我用io.ReadFull
代替。golang Read(p []字節)不讀全字節?
現在我很困惑,函數的含義是什麼?使用Read的適當場景是什麼?它可能只讀取比您需要的更少的字節。
如果您檢查文檔和源代碼,您會明白爲什麼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
而是使用EOF
或EOL
分隔符爲參數,這取決於你的使用情況。
是的,這正是文檔的狀態。看看整個stdlib中如何使用Read,你不確定。 – Volker