Go语言 为什么用'chan struct{}'当等待的东西没有'chan interface{}'?

ss2ws0br  于 2023-03-16  发布在  Go
关注(0)|答案(2)|浏览(205)

在golang,当我们需要等待某件事完成时,我们会使用通道。
示例:

done := make(chan struct{})
go func() {
    // ...
    close(done)
}()
<-done

但是,在其他方面,chan interface{}也适用于这种情况。
那么,chan struct{}chan interface{}之间的区别是什么呢?
例二:

done := make(chan struct{})
go func() {
    // ...
    done <- struct{}{}
}()
<- done

在其他情况下,if不关闭goroutine中的通道,而是发送对象给它。
在goroutine中会创建一个对象,但是如果使用chan interface{},可以将nil对象发送到channel。
使用chan struct{}更好吗?

f8rj6qna

f8rj6qna1#

在你的例子中,一个“done”通道,从功能上来说,它可以是任何类型的,因为实际上没有数据被发送,通道只是作为一个信号机制使用,但是从内存利用率的Angular 来看,struct{}是Go语言中最小的数据类型,因为它实际上什么都不包含,所以不需要分配,这就是为什么它通常被用在这样的场景中。

xkftehaa

xkftehaa2#

空的结构体struct {}不需要内存。所以如果你有一个大容量的通道,你可以通过从make(chan bool, 1<<16)切换到make(struct {}, 1<<16)来保存几个字节。使用接口{}需要更多的空间,在这里真的很奇怪。
对于一个无缓冲的done通道,我认为使用struct {}是 * 错误的 *,因为它不清楚。使用简单的chan bool要明智得多。使用interface {}是完全错误的:它可能比struct {}占用更多的空间,甚至更不清晰。

相关问题