在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{}
更好吗?
2条答案
按热度按时间f8rj6qna1#
在你的例子中,一个“done”通道,从功能上来说,它可以是任何类型的,因为实际上没有数据被发送,通道只是作为一个信号机制使用,但是从内存利用率的Angular 来看,
struct{}
是Go语言中最小的数据类型,因为它实际上什么都不包含,所以不需要分配,这就是为什么它通常被用在这样的场景中。xkftehaa2#
空的结构体
struct {}
不需要内存。所以如果你有一个大容量的通道,你可以通过从make(chan bool, 1<<16)
切换到make(struct {}, 1<<16)
来保存几个字节。使用接口{}需要更多的空间,在这里真的很奇怪。对于一个无缓冲的done通道,我认为使用struct {}是 * 错误的 *,因为它不清楚。使用简单的
chan bool
要明智得多。使用interface {}是完全错误的:它可能比struct {}占用更多的空间,甚至更不清晰。