为什么在等待某些未通过“ chan interface {}”执行的操作时使用“ chan struct {}”?

时间:2018-08-27 08:30:59

标签: go

在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{}的更好方法吗?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:-2)

空结构struct {}不需要内存。因此,如果您的频道容量很大,可以从make(chan bool, 1<<16)切换到make(struct {}, 1<<16)来节省一些字节。使用界面{}需要更多空间,在这里真的很奇怪。

对于一个没有缓冲的完成通道,我认为使用struct {}是错误,因为目前尚不清楚。使用简单的chan bool更为明智。使用接口{}是完全错误的:它可能比struct {}使用更多的空间,甚至不够清晰。