老师,我想问下,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回答

牛儿吃草

2020-06-26

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的关闭才对,以释放端口资源。

//img1.sycdn.imooc.com/szimg/5ef5f0fd081694a514781032.jpg


0
1
weixin_慕九州8446065
非常感谢!
2020-06-26
共1条回复

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程