一尘不染

匿名结构和空结构

go

http://play.golang.org/p/vhaKi5uVmm

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 }
}

[第一个问题]

 done <- struct{}{}

我们如何以及为什么需要这种看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索,但是找不到正确的答案或说明文档。

原始资料来自Andrew Gerrand的演讲
http://nf.wh3rd.net/10things/#10

这里

 make(chan struct{})

完成是struct {}类型的通道

所以我尝试了

 done <- struct{}

但这是行不通的。为什么我需要为该行加一个括号?

 done <- struct{}{}

[第二个问题]

 for _ = range langs { <-done }

为什么我需要这条线?我知道这行是必要的,因为没有这行,就没有输出。但是,为什么这行呢?什么使该代码有必要?我知道这<-done是从已完成的通道接收值并丢弃接收到的值。但是,为什么我需要这样做?


阅读 306

收藏
2020-07-02

共1个答案

一尘不染

复合文字

复合文字量为结构,数组,切片和映射构造值,并在每次对其求值时创建一个新值。它们由值的类型和紧随其后的复合元素列表组成。元素可以是单个表达式或键值对。

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

for _ = range langs { <-done }正在等待,直到所有goroutines langs已发送所有done消息。

2020-07-02