是否需要检查Write In Golang返回的"n"

fra*_*lin 2 networking go

我有一台服务器并启动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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

今天,我想我应该检查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
     }
 }
Run Code Online (Sandbox Code Playgroud)

我想知道这样做是对的吗?PS如果对等体缓慢接收消息并Write返回只有部分数据成功发送,该怎么办?

two*_*two 7

文档说Write如果返回则必须返回非零错误n < len(p).通常,所有写入错误都同样糟糕,您只需分配n_; 你只需要在特殊情况下检查它.