将通道传递给方法或直接访问嵌套结构对象

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 字段,以便稍后设置。或者使用“构造函数”在启动时构建通道并将其存储在结构中(甚至可以作为私有字段)。

然后所有方法都可以更容易地访问该频道。