为了账号安全,请及时绑定邮箱和手机立即绑定

匿名结构体和空结构体

匿名结构体和空结构体

Go
肥皂起泡泡 2021-07-09 14:07:28
http://play.golang.org/p/vhaKi5uVmmpackage mainimport "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 }}[第一个问题] done <- struct{}{}我们如何以及为什么需要这个看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索但找不到正确的答案或文档来解释这一点。原始来源来自 Andrew Gerrand 的演讲 http://nf.wh3rd.net/10things/#10这里 make(chan struct{})done 是 struct{} 类型的通道所以我试过 done <- struct{}但它不起作用。为什么我需要为这条线添加一个额外的括号? done <- struct{}{}[第二个问题] for _ = range langs { <-done }为什么我需要这条线?我知道这条线是必要的,因为没有这条线,就没有输出。但是为什么这条线有什么作用呢?是什么让它在这段代码中变得必要?我知道这<-done是从完成的通道接收值并丢弃接收到的值。但为什么我需要这样做?
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

复合文字

复合文字为结构体、数组、切片和映射构造值,并在每次评估它们时创建一个新值。它们由值的类型后跟花括号绑定的复合元素列表组成。元素可以是单个表达式或键值对。

struct{}{}是 type 的复合文字,struct{}值的类型后跟一个括号绑定的复合元素列表。

for _ = range langs { <-done }正在等待,直到所有 goroutine 的所有 goroutinelangs都发送了done消息。


查看完整回答
反对 回复 2021-07-12
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

  1. struct{}是一种类型(特别是没有成员的结构)。如果您有类型Foo,则可以在表达式中创建该类型的值Foo{field values, ...}。把它们放在一起,struct{}{}是一个类型的值struct{},这是通道所期望的。

  2. main函数产生warriorgoroutines,done当它们完成时将写入通道。最后一个for块从此通道读取,确保main在所有 goroutine 完成之前不会返回。这很重要,因为程序将在main完成时退出,而不管是否有其他 goroutine 在运行。


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信