或者如何检查它是否可用于Read或Write在循环中?如果 conn 已关闭或不可用,我们应该停止循环。
例如:
package main
import "net"
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:1111")
defer conn.Close()
for {
buf := make([]byte, 1, 1)
n, err := conn.Read(buf)
if err != nil {
// currently we can only stop the loop
// when occur any errors
log.Fatal(err)
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会收到许多错误,具体取决于连接关闭的方式。您可以指望从 a 收到的唯一错误Read是io.EOF. io.EOF是用于指示连接已正常关闭的值。
其他错误可以根据net.Error其接口Timeout和Temporary方法进行检查。这些通常属于net.OpError. 从 a 返回的任何非临时错误Write都是致命的,因为它表明写入无法成功,但请注意,由于底层网络 API,不返回错误的写入仍然不能保证成功。
一般情况下按照api就可以了io.Reader。
当 Read 在成功读取 n > 0 字节后遇到错误或文件结束条件时,它返回读取的字节数。它可能会从同一调用返回(非零)错误,或从后续调用返回错误(且 n == 0)。这种一般情况的一个实例是,在输入流末尾返回非零字节数的 Reader 可能返回 err == EOF 或 err == nil。下一次读取应返回 0、EOF。
如果有数据读取,您首先处理它。处理数据后,您可以在出现任何错误时中断循环。如果是io.EOF,则连接将正常关闭,并且您可以根据需要处理任何其他错误。