加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

并发 – Golang:匿名结构和空结构

发布时间:2020-12-16 19:20:05 所属栏目:大数据 来源:网络整理
导读:http://play.golang.org/p/vhaKi5uVmm package mainimport "fmt"var battle = make(chan string)func warrior(name string,done chan struct{}) { select { case opponent := -battle: fmt.Printf("%s beat %sn",name,opponent) case battle - name: // I l
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 %sn",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{}{}

为什么我们需要这个奇怪的结构?是空结构还是匿名结构?我google了,但找不到正确的答案或文档来解释这一点。

最初的来源是安德鲁·格兰德的讲话
http://nf.wh3rd.net/10things/#10

这里

make(chan struct{})

done是一个struct {}的通道

所以我试过

done <- struct{}

但它不工作。为什么我需要这条线额外的方括号?

done <- struct{}{}

[第二题]

for _ = range langs { <-done }

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

07000

Composite literals construct values for structs,arrays,slices,and
maps and create a new value each time they are evaluated. They consist
of the type of the value followed by a brace-bound list of composite
elements. An element may be a single expression or a key-value pair.

struct {} {}是一个类型为struct {}的复合文字,后面跟着一个括号的复合元素列表的类型。

对于_ = range langs {< -done}正在等待,直到所有lang的所有goroutines都发送完成消息。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读