Go 为什么在等待未执行的操作时使用'chan struct{}'而不是'chan interface{}'?

Go 为什么在等待未执行的操作时使用'chan struct{}'而不是'chan interface{}'?,go,Go,在golang,当我们需要等待一些事情完成时,我们将使用一个频道 例如: done := make(chan struct{}) go func() { // ... close(done) }() <-done 在另一种情况下,如果不关闭goroutine中的通道,则将对象发送给它 将在goroutine中创建一个对象,但如果使用chan接口{},则可以将nil对象发送到通道 使用chan struct{}是否更好?在您的“完成”通道示例中,从功能上讲,通道可以是任何类

在golang,当我们需要等待一些事情完成时,我们将使用一个频道

例如:

done := make(chan struct{})
go func() {
    // ...
    close(done)
}()
<-done
在另一种情况下,如果不关闭goroutine中的通道,则将对象发送给它

将在goroutine中创建一个对象,但如果使用
chan接口{}
,则可以将
nil
对象发送到通道


使用
chan struct{}
是否更好?

在您的“完成”通道示例中,从功能上讲,通道可以是任何类型,因为实际上没有发送数据,并且通道仅用作信令机制。但是为了提高内存利用率,
struct{}
是Go中可用的最小数据类型,因为它实际上不包含任何内容,因此不需要分配,这就是为什么在这种情况下通常使用它的原因。

空的struct
struct{}
不需要内存。因此,如果你有一个大容量的通道,你可以通过从
make(chan bool,1)切换来节省几个字节。我对你的最后一段感到困惑。
struct{}是什么意思
对于一个未缓冲完成的频道来说是错误的?那么
chan bool
如何更明智呢?
chan bool
意味着您将通过该频道发送真值或假值,而这不是真值,因此看起来是“错误的”对我来说。但我很想知道你的理由。@stdlib中的Flimzy Done频道是chan bool,即使你从不发送虚假的或甚至不发送任何东西,只是关闭频道,使用chan bool更为自然。例如,chan struct{}也不表示你从未打算发送任何东西。struct{}更易于键入和阅读,尤其是一种罕见的语言构造,具有特殊语义,因为结构{}的所有实例可能共享相同的内存位置。不太常见,更复杂,更多字符,更不清晰==>错误。“stdlib中的完成通道是chan bool”--这不是一个普遍正确的说法。stdlib中有许多用于done通道的
chan struct{}
示例。但是感谢您的解释。
done := make(chan struct{})
go func() {
    // ...
    done <- struct{}{}
}()
<- done