英文:
Pass channel in to method or access nested struct object directly
问题
我正在翻译以下内容:
我正在使用的基础代码将通道传递给多个方法。同样的通道也可以通过嵌套结构进行访问。我可以通过使用p.Server.logCh来访问相同的logCh。我知道通道在传递时非常轻量级,但是是否有理由不直接访问它?将有多个并发的goroutine访问这个相同的通道。
type Processor struct {
Server *Server
}
func (p *Processor) Process(messagesCh <-chan storage.QueueMessage, logCh chan<- model.Log, done chan struct{}) { }
英文:
The base code I was working off of passes the channel in to multiple methods. The same channel is also accessible through nested structs. I can access the same logCh by using p.Server.logCh. I know channels are pretty lightweight to pass around but is there a reason not to access it directly? There will be multiple concurrent goroutines accessing this same channel.
type Processor struct {
Server *Server
}
func (p *Processor) Process(messagesCh <-chan storage.QueueMessage, logCh chan<- model.Log, done chan struct{}) { }
答案1
得分: 0
通道被设计为可以安全复制和并发读写的。所以你的问题更多是关于编码方便性的问题。
为了使代码更易读,请参考下面的建议。
如果你发现你经常引用一个常见的参数,将其移动到接收者结构体可能是有意义的,例如:
type Processor struct {
Server *Server
MessagesCh <-chan storage.QueueMessage
}
可以将其设置为公共字段,以便稍后设置。或者在启动时使用“构造函数”构建通道并将其存储在结构体中(甚至可以作为私有字段)。
然后通道更容易被所有方法访问。
英文:
Channels are designed to be safe to copy and for concurrent read/writes. So your question is more a matter of coding convenience.
To make code more readable, see the suggestion below.
If you find you are frequently referencing a common parameter, it may make sense to move it to the receiver struct e.g.
type Processor struct {
Server *Server
MessagesCh <-chan storage.QueueMessage
}
either make it a public field, so it can be set later. Or use a "constructor" to build the channel at startup and store it in the struct (maybe even as a private field).
Then the channel is accessible to all methods more readily.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论