猿问

go 的 net.Close() 是幂等的吗?

io.Closer接口的文档说:

第一次调用后关闭的行为是未定义的。具体的实现可能会记录他们自己的行为。

anet.ConnClose()功能呢?我可以安全地多次调用它吗?

具体来说,我想知道我是否可以defer c.Close()提前返回错误,但仍然显式调用c.Close()而不是让客户端等待我完成后台处理。


慕丝7291255
浏览 107回答 1
1回答

慕盖茨4494581

嗯,net.Conn是一个接口,所以要看具体的实现。我检查了TCPConn,UDPConn和IPConnstructs 中的实现。它们似乎包含这个net.Conn接口的实现。这个实现将Close()调用传播到它的底层文件描述符,这意味着在 Unix 系统上这个函数会被调用。我们必须走得更低,因为下一个调用是文件描述符使用的互斥锁。如果连接先前已关闭并释放互斥锁,则它似乎返回 false,并且文件描述符Close()函数返回ErrNetClosing 错误。所以,我可以自由地说,你不应该多次调用它,因为在我描述的这种情况下,它会返回一个错误。但它也可能不会在其他人中出错。正如文档所说 - 这是未定义的行为。
随时随地看视频慕课网APP

相关分类

Go
我要回答