我有一台服务器并启动goroutine来发送数据。像这样的代码
func handleSend(conn *net.TcpConn, ch <-chan []byte) {
for {
select {
case msg, ok := <-ch:
if !ok {
return
}
n, err := conn.Write(msg)
if err != nil {
log.Error("conn write error", err)
return
}
//here
}
}
}
今天,我想我应该检查n
返回conn.Write
以确保msg
完全被写入。因此,我在here
for ;n!= len(msg);{
log.Error("conn write not completely", len(msg), "actually", n)
msg = msg[n:]
n, err = sess.conn.Write(msg)
if err != nil {
log.Error("conn write error", err)
return
}
}
我想知道这样做是对的吗?
PS如果对等体慢慢接收消息并Write
返回只有部分数据成功发送,该怎么办?
答案 0 :(得分:5)
Docs say Write
must return a non-nil error if it returns n < len(p)
.通常,所有写入错误都同样糟糕,您可以将n
分配给_
;你只需要在特殊情况下检查它。