2014-07-22 15 views
2

我有一个服务器,我正在写,我想处理来自conn.Read()的错误。具体来说,我不想在客户端关闭连接的情况下做任何事情,但如果有任何其他错误,则记录错误。我遇到了以下问题:如何检查Go中的特定网络错误?

  1. 该文档似乎没有说出conn.Read()可能返回的错误。
  2. 连接关闭的客户端似乎是一个EOF错误。原来,它的类型是error.errorString。真的吗?

所以基本上我必须做一个字符串比较“EOF”来告诉我的错误是预期的还是真正的错误?!?我错过了什么吗?因为这似乎是目前一个巨大的监督......

回答

2

哦,不,这是因为string作为it's defined

import "errors" 
... 
var EOF = errors.New("EOF") 

,什么errors.New(string)回报确实是一个类型转换为string,因为这种类型的,errorString仅仅嵌入您传递给error.New(string)的字符串,其唯一目的是定义其上的Error() string方法—以满足error接口。

但是你测试此特定错误(文件末尾)是这样的:

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

也就是说,你不比较字符串,而是由一定的库模块导出一个众所周知的变量,而地址(在这种情况下为“io”)。

+0

啊,优秀!那么我怎么会发现我想检查的错误是io.EOF而不询问StackOverflow?我认为我错过了文档中的某些内容? – prewett

+0

为了澄清,我假设文档中有某些东西我错过了某处,会指向我看看io包,即使我没有使用io的任何函数? – prewett

+0

@prewett,好吧,我恐怕确实没有明显的联系,或者它对于某些思维方式的人来说显而易见 - 让我解释一下。 Go是非常正交和最小的,所以实际上stdlib中读取字节的所有类型都满足'io.Reader'接口,并且一旦你知道了这个想法,就可以使用实现一个类型的Read()方法字节的TCP流返回什么'io.Reader.Read()'被定义为在遇到EOF时返回是不言而喻的。 – kostix