Go 捕获传递给http.Server.service的net.Listener

Go 捕获传递给http.Server.service的net.Listener,go,wrapper,httpserver,Go,Wrapper,Httpserver,我想通过执行优雅的关机和一些其他小工具来扩展http.Server功能,这些小工具将在我的http服务中共享。目前,我的代码或多或少地说: type MyServer struct { server *http.Server // ... } func (s *MyServer) ListenAndServe() { // Create listener and pass to s.server.Serve() } 这非常有效,但需要手动公开http.Server的所

我想通过执行优雅的关机和一些其他小工具来扩展
http.Server
功能,这些小工具将在我的http服务中共享。目前,我的代码或多或少地说:

type MyServer struct {
    server *http.Server
    // ...
}

func (s *MyServer) ListenAndServe() {
    // Create listener and pass to s.server.Serve()
}
这非常有效,但需要手动公开
http.Server
的所有必要方法和变量

包装大多数方法不会是一个大问题,但我找不到一种明智的方法来公开对
http.Server.ListenAndServeTLS的访问,而不从中实际复制实现。方法的最后一行是
srv.service(tlsListener)
,我想提供我自己的
service
方法,因此在将
net.Listener
传递给
http.Server.service
之前,可以修改
net.Listener

我开始用铅笔写我的包装纸,简单地写:

type MyServer struct {
    http.Server
}

func (s *MyServer) Serve(l net.Listener) {
    // Wrap l with MyListener, pass to s.Server.Serve()
}
但是显然,无论是
http.listenandservet
还是
http.ListenAndServeTLS
都不会开始使用我的
service
实现。我想请他们。。。有什么方法可以解决这个问题吗?
http.Server
的设计是否有效地阻止了我解决这个问题


Hacks welcome:即使我不在生产中使用它们,我也会学到一些知识。

http.ListenAndServe*
方法将适用于嵌入式类型。另一种方法是:

type MyServer struct {
  http.Server
  // ...
}

func (s *MyServer) ListenAndServe() error {
  // create listener
  // s.Server.Serve(s.listener)
}

func (s *MyServer) ListenAndServeTLS() error {
  // create listener
  // s.Server.Serve(s.tlsListener)
}

如果我调用
MyServer.ListenAndServeTLS
,那么将使用
http.Server.service
,而不是我提供的实现。我想捕获在
ListenAndServeTLS
中创建的
net.Listener
。然后也实现
ListenAndServeTLS()
,类似于我的示例中的
ListenAndServe()
。更新示例:)这正是我的问题:我不想实现它,因为它非常重要。我可以从中复制实现,但不知道这是否可以避免。不要试图变得聪明,你想要一个优雅的
net.Listener
,所以提供一个
net.Listener
。你不必在意谁在用它。