为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕丝7291255 2022-07-11 14:34:19
该io.Closer接口的文档说:第一次调用后关闭的行为是未定义的。具体的实现可能会记录他们自己的行为。anet.Conn的Close()功能呢?我可以安全地多次调用它吗?具体来说,我想知道我是否可以defer c.Close()提前返回错误,但仍然显式调用c.Close()而不是让客户端等待我完成后台处理。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

嗯,net.Conn是一个接口,所以要看具体的实现。

我检查了TCPConn,UDPConnIPConnstructs 中的实现。它们似乎包含这个net.Conn接口的实现。

这个实现将Close()调用传播到它的底层文件描述符,这意味着在 Unix 系统上这个函数会被调用。

我们必须走得更低,因为下一个调用是文件描述符使用的互斥锁。

如果连接先前已关闭并释放互斥锁,则它似乎返回 false,并且文件描述符Close()函数返回ErrNetClosing 错误

所以,我可以自由地说,你不应该多次调用它,因为在我描述的这种情况下,它会返回一个错误。但它也可能不会在其他人中出错。正如文档所说 - 这是未定义的行为。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号