如何检查Go中的特定网络错误?

如何检查Go中的特定网络错误?,go,Go,我有一个正在编写的服务器,我想处理conn.Read()中的错误。具体来说,我不想在客户端关闭连接的情况下执行任何操作,但如果是其他错误,则记录错误。我遇到了以下问题: 文档似乎没有说明conn.Read()可以返回哪些错误 客户端关闭的连接似乎是EOF错误。结果证明它的类型是error.errorString。真的吗 所以基本上我必须和“EOF”做一个字符串比较来判断我的错误是预期的还是真正的错误?!?我错过什么了吗?因为目前这似乎是一个巨大的疏忽…嗯,不,这是string因为 而errors

我有一个正在编写的服务器,我想处理conn.Read()中的错误。具体来说,我不想在客户端关闭连接的情况下执行任何操作,但如果是其他错误,则记录错误。我遇到了以下问题:

  • 文档似乎没有说明conn.Read()可以返回哪些错误
  • 客户端关闭的连接似乎是EOF错误。结果证明它的类型是error.errorString。真的吗

  • 所以基本上我必须和“EOF”做一个字符串比较来判断我的错误是预期的还是真正的错误?!?我错过什么了吗?因为目前这似乎是一个巨大的疏忽…

    嗯,不,这是
    string
    因为

    errors.New(string)
    返回的内容实际上是一个可转换为
    string
    的类型,因为该类型只嵌入传递给
    error.New(string)
    的字符串,其唯一目的是定义
    error()string
    方法以满足
    error
    接口

    但您要测试此特定错误(文件结尾),如下所示:

    import "io"
    ...
    if err == io.EOF {
    ...
    

    也就是说,您不是在比较字符串,而是在比较某个库模块(“io”)导出的已知变量的地址。

    啊,太好了!那么,我如何在不询问StackOverflow的情况下发现我要检查的错误是io.EOF呢?我假设文档中有我遗漏的东西?为了澄清,我假设文档中有我遗漏的东西,可以让我查看io包,即使我没有使用io中的任何函数?@prewett,恐怕确实没有明显的联系,或者,相反,对于那些有着某种心态的人来说,这是显而易见的——让我来解释一下。Go是非常正交和最小的,因此它的stdlib中读取字节的所有类型都满足
    io.Reader
    接口,一旦你了解了这一点,实现TCP字节流的类型上的
    read()
    方法就会返回
    io.Reader.read()
    定义为遇到EOF时返回是不言而喻的。@prewett,如何到达那里的问题更复杂。。。我假设大多数人在某个时候读过大部分的文章(真的是必读的),“有效的围棋”文档和其他类似的东西,然后他们的大脑中就有了这个“谜题”的所有必要部分。我有一种感觉,这就是答案。。。“有效围棋”显然是必要的,但它无法回答这个问题。我对Go的糟糕文档非常失望,这是我使用过的最糟糕的文档之一。然后,我发现如果你想知道错误是否是超时,你似乎需要执行“if netErr,ok:=err.(net.error);ok&&netErr.timeout()”这是完全不一致的。谢谢你的其他链接,我会通读的。
    import "io"
    ...
    if err == io.EOF {
    ...