在golang中,当我们需要等待某些事情完成时,我们将使用一个通道来等待它完成。
示例:
done := make(chan struct{})
go func() {
// ...
close(done)
}()
<-done
但是,在这种情况下,chan interface{}
可以正常工作。
那么chan struct{}
和chan interface{}
有什么区别?
示例2:
done := make(chan struct{})
go func() {
// ...
done <- struct{}{}
}()
<- done
在其他情况下,如果不关闭goroutine中的通道而不是向其发送对象。
将在goroutine中创建一个对象,但是如果使用chan interface{}
,则可以将nil
个对象发送到通道。
这是代替chan struct{}
的更好方法吗?
答案 0 :(得分:8)
在您的“完成”通道示例中,从功能上讲,该通道实际上可以是任何类型,因为实际上没有数据发送,并且该通道仅用作信令机制。但是出于内存利用率的考虑,struct{}
是Go中可用的最小数据类型,因为它实际上不包含任何内容,因此不需要分配,这就是为什么在这种情况下通常使用它。
答案 1 :(得分:-2)
空结构struct {}
不需要内存。因此,如果您的频道容量很大,可以从make(chan bool, 1<<16)
切换到make(struct {}, 1<<16)
来节省一些字节。使用界面{}需要更多空间,在这里真的很奇怪。
对于一个没有缓冲的完成通道,我认为使用struct {}是错误,因为目前尚不清楚。使用简单的chan bool
更为明智。使用接口{}是完全错误的:它可能比struct {}使用更多的空间,甚至不够清晰。