将通道传递给方法或直接访问嵌套结构对象
Pass channel in to method or access nested struct object directly
我正在处理的基本代码将通道传递给多个方法。也可以通过嵌套结构访问相同的通道。我可以使用 p.Server.logCh 访问相同的 logCh。我知道通道非常轻量级,可以传递,但有理由不直接访问它吗?将有多个并发的 goroutines 访问同一个通道。
type Processor struct {
Server *Server
}
func (p *Processor) Process(messagesCh <-chan storage.QueueMessage, logCh chan<- model.Log, done chan struct{}) { }
通道被设计为可以安全地复制和并发 read/writes。所以你的问题更多的是编码方便的问题。
为了使代码更具可读性,请参阅以下建议。
如果您发现自己经常引用一个公共参数,将其移至接收结构体可能是有意义的,例如
type Processor struct {
Server *Server
MessagesCh <-chan storage.QueueMessage
}
要么将其设为 public 字段,以便稍后设置。或者使用“构造函数”在启动时构建通道并将其存储在结构中(甚至可以作为私有字段)。
然后所有方法都可以更容易地访问该频道。
我正在处理的基本代码将通道传递给多个方法。也可以通过嵌套结构访问相同的通道。我可以使用 p.Server.logCh 访问相同的 logCh。我知道通道非常轻量级,可以传递,但有理由不直接访问它吗?将有多个并发的 goroutines 访问同一个通道。
type Processor struct {
Server *Server
}
func (p *Processor) Process(messagesCh <-chan storage.QueueMessage, logCh chan<- model.Log, done chan struct{}) { }
通道被设计为可以安全地复制和并发 read/writes。所以你的问题更多的是编码方便的问题。
为了使代码更具可读性,请参阅以下建议。
如果您发现自己经常引用一个公共参数,将其移至接收结构体可能是有意义的,例如
type Processor struct {
Server *Server
MessagesCh <-chan storage.QueueMessage
}
要么将其设为 public 字段,以便稍后设置。或者使用“构造函数”在启动时构建通道并将其存储在结构中(甚至可以作为私有字段)。
然后所有方法都可以更容易地访问该频道。