3 回答

TA貢獻1786條經驗 獲得超11個贊
你的方法聽起來基本正確。一些備注:
當您在 中找到第一個 nul 字節的索引時
data
,您不需要復制,只需截斷切片:data[:idx]
。bytes.Index應該能夠為您找到該索引。
還有
bytes.Replace
所以你不需要轉換為字符串。

TA貢獻2065條經驗 獲得超14個贊
該io.Reader文檔說:
Read 將最多 len(p) 個字節讀入 p。它返回讀取的字節數 (0 <= n <= len(p)) 和遇到的任何錯誤。
如果應用程序中對 Read 的調用未讀取 16 個字節,data則將有尾隨零字節。使用讀取的字節數從緩沖區中修剪零字節。
data := make([]byte, 16)
n, err := c.Read(data)
if err != nil {
// handle error
}
data = data[:n]
還有一個問題。無法保證 Read 會吸收對等方發送的所有“消息”。應用程序可能需要多次調用 Read 來獲取完整的消息。
您在問題中提到了結尾。如果來自客戶端的消息終止但換行,則使用bufio.Scanner從連接中讀取行:
s := bufio.NewScanner(c)
if s.Scan() {
data = s.Bytes() // data is next line, not including end lines, etc.
}
if s.Err() != nil {
// handle error
}
- 3 回答
- 0 關注
- 362 瀏覽
添加回答
舉報