考虑以下代码片段,它使用 struct{} 类型的通道来促进 goroutine 之间的通信:
package main import "fmt" var battle = make(chan string) func warrior(name string, done chan struct{}) { select { case opponent := <-battle: fmt.Printf("%s beat %s\n", name, opponent) case battle <- name: // I lost :-( } done <- struct{}{} } func main() { done := make(chan struct{}) langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"} for _, l := range langs { go warrior(l, done) } for _ = range langs { <-done } }
[问题1]
done
一个空结构struct 是一个没有任何字段的结构体。它也称为匿名结构。空结构体的目的是提供一种创建没有字段的类型的方法,这对于各种原因都很有用,例如:
在我们的代码中,我们使用匿名结构来表示 Goroutine 已完成其工作。为此目的使用空结构体是有利的,因为它的大小为 0,可以最大限度地减少内存占用。
[问题 2]
_ = range langs 的行{
通过使用 struct{} 类型的通道和空结构体作为信号机制,我们可以以最小的开销实现 goroutine 之间的高效通信.
以上是Go 中的匿名结构与空结构:为什么使用 struct{} 进行 Goroutine 同步?的详细内容。更多信息请关注PHP中文网其他相关文章!