当我读到nsq源代码的nsqlookupd部分时,我发现作者使用了一个Context truct来包装一个NSQLookupd结构,而没有其他函数用于Context.I不知道为什么我们这样使用它,有什么好处我们可以通过这种方式获得?这里的源代码如下。谢谢!
context.go
type Context struct {
nsqlookupd *NSQLookupd
}
nsqlookupd.go
func (l *NSQLookupd) Main() {
ctx := &Context{l}
tcpListener, err := net.Listen("tcp", l.opts.TCPAddress)
if err != nil {
l.logf(LOG_FATAL, "listen (%s) failed - %s", l.opts.TCPAddress, err)
os.Exit(1)
}
l.Lock()
l.tcpListener = tcpListener
l.Unlock()
tcpServer := &tcpServer{ctx: ctx}
l.waitGroup.Wrap(func() {
protocol.TCPServer(tcpListener, tcpServer, l.opts.Logger)
})
答案 0 :(得分:0)
因为面向未来。
Context
struct提供了一种将特定于上下文的数据包装到单个结构中的方法。此时,上下文仅包含指向NSQLookupd
结构的指针。但是,如果需要以某种方式扩展Context
,那么您只需要向结构中添加更多字段即可。您也可以实现struct方法。
所有这些都不需要更改程序中的内部API,因为所有这些新的字段和方法都包含在结构中,并且已经在程序中传递。您很可能必须更改结构初始化的方式。