我正在与接受*tls.Conn
的http客户端API进行交互。我无法更改API。我希望在连接关闭时执行一些代码,但我没有看到这样做的方法。如果我创建一个嵌入*tls.Conn
和I"覆盖" Close()
,API不接受结构,因为只跟随子类型是 - 与接口的关系 - tls.Conn
不是接口。
有没有办法解决这个问题 - 是否有一些标准的钩子可以用来在客户端连接关闭时收到通知?
答案 0 :(得分:2)
如果你正在使用tls.Client来构建*tls.Conn
,那么你可以包装第一个参数来实现你的目标。
type CloseListener struct {
net.Conn // embed the original conn
}
func (c *CloseListener) Close() error {
err := c.Conn.Close()
// ... do your stuff ...
return err
}
conn := tls.Client(&CloseListener{c}, &tls.Config{ /* ... */ })
如果你看一下tls.Conn's Close的实现方式,你会发现除非出现错误,否则应该调用你的Close实现。