1 回答

TA貢獻(xiàn)1744條經(jīng)驗 獲得超4個贊
該Conn.Read()方法是為了實現(xiàn)io.Reader,從任何字節(jié)源讀取數(shù)據(jù)的通用接口[]byte。引用自 的文檔Reader.Read():
Read 將最多 len(p) 個字節(jié)讀入 p。
因此Read()最多讀取len(p)字節(jié),但由于您傳遞了一個nil切片,它不會讀取任何內(nèi)容(nil切片的長度為0)。請閱讀鏈接的文檔以了解Reader.Read()工作原理。
Reader.Read()沒有分配一個緩沖區(qū) ( []byte) 來存儲讀取的數(shù)據(jù),你必須創(chuàng)建一個并傳遞它,例如:
var buf = make([]byte, 100)
n, err := conn.Read(buf)
// n is the number of read bytes; don't forget to check err!
不要忘記始終檢查返回的數(shù)據(jù),如果到達(dá)數(shù)據(jù)末尾error可能會返回io.EOF。的常規(guī)協(xié)定io.Reader.Read()還允許返回一些非nil錯誤(包括io.EOF)和一些讀出的數(shù)據(jù)(n > 0)在同一時間。讀取的字節(jié)數(shù)將在n,這意味著只有 的第一個n字節(jié)buf是有用的(換句話說:)buf[:n]。
您使用的其他示例bufio.Reader有效,因為您調(diào)用了Reader.ReadString()which 不需要[]byte參數(shù)。如果您使用了該bufio.Reader.Read()方法,您還必須傳遞一個非nil切片才能實際獲取一些數(shù)據(jù)。
- 1 回答
- 0 關(guān)注
- 202 瀏覽
添加回答
舉報