老师,我想问下,net/http/server.go包中
来源:2-13 脑图精讲http Server源码

weixin_慕九州8446065
2020-06-21
在func (srv *Server) Serve(l net.Listener) error {}中origListener := l l = &onceCloseListener{Listener: l}代表什么意思,或者说在后续和那段代码联系在一起,起到什么作用。很是困惑
1回答
-
type onceCloseListener struct {
net.Listener
once sync.Once
closeErr error
}
func (oc *onceCloseListener) Close() error {
oc.once.Do(oc.close)
return oc.closeErr
}onceCloseListener结构体主要作用是进行一次性关闭操作。原理是借助sync.Once中的Do方法。只要执行过一次就不会执行第二次了。
我们可以在Serve函数退出中执行 srv.l.Close 方法表示不进行socket监听了。
也可以在Close函数中主动执行srv.l.Close方法。两者只会执行一次。
如下图,主动执行Close函数的话,Serve函数内部的for中l.Accept会发生错误,最终会导致函数退出。这时再重复执行 srv.l.Close 时其实无任何影响了。
为啥会要执行两次 srv.l.Close 呢?实际在select{}内的错误,可能会有多种,我们这里只列举一种,如果多种错误都要退出时。我们在退出Serve时必须要执行下listen的关闭才对,以释放端口资源。
012020-06-26
相似问题