在Golang,当我们需要等待完成某些事情时,我们将使用一个频道等待它完成.
例:
done := make(chan struct{})
go func() {
// ...
close(done)
}()
<-done
Run Code Online (Sandbox Code Playgroud)
但是,换句话说,chan interface{}在这种情况下工作正常.
那么,chan struct{}和之间有什么区别chan interface{}?
例2:
done := make(chan struct{})
go func() {
// ...
done <- struct{}{}
}()
<- done
Run Code Online (Sandbox Code Playgroud)
在其他情况下,如果不关闭goroutine中的通道而不是发送对象.
将在goroutine中创建一个对象,但如果使用chan interface{},则可以将nil对象发送到通道.
相反,这是一个更好的方法chan struct{}吗?
Fli*_*mzy 12
在"完成"通道的示例中,从功能上讲,通道可以是任何类型,因为实际上没有数据被发送,并且通道仅用作信令机制.但是为了内存利用率,struct{}是Go中可用的最小数据类型,因为它几乎不包含任何内容,因此不需要分配,这就是它通常在这种情况下使用的原因.
空结构struct {}不需要内存。make(chan bool, 1<<16)因此,如果您有一个大容量的通道,您可以通过从 切换到 来节省一些字节make(struct {}, 1<<16)。使用接口 {} 需要更多空间,这在这里确实很奇怪。
对于无缓冲的完成通道,我认为使用 struct {} 是错误的,因为它不清楚。使用简单chan bool的更明智。使用interface{}是完全错误的:它可能使用更多空间,甚至比struct{}更不清晰。