为什么nsqlookupd包使用Context?

时间:2017-05-24 04:33:23

标签: go nsq

当我读到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)
})

1 个答案:

答案 0 :(得分:0)

因为面向未来。

Context struct提供了一种将特定于上下文的数据包装到单个结构中的方法。此时,上下文仅包含指向NSQLookupd结构的指针。但是,如果需要以某种方式扩展Context,那么您只需要向结构中添加更多字段即可。您也可以实现struct方法。

所有这些都不需要更改程序中的内部API,因为所有这些新的字段和方法都包含在结构中,并且已经在程序中传递。您很可能必须更改结构初始化的方式。