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

时间:2014-12-09 04:37:11

标签: 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

        }
    }
}

今天,我想我应该检查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返回只有部分数据成功发送,该怎么办?

1 个答案:

答案 0 :(得分:5)

Docs say Write must return a non-nil error if it returns n < len(p).通常,所有写入错误都同样糟糕,您可以将n分配给_;你只需要在特殊情况下检查它。