请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

<- worker.done 两次的意思是什么?

package main

import (
	"fmt"
)

type work struct {
	in   chan int
	done chan bool
}

func doWorker(id int, w work) {
	for n := range w.in {
		fmt.Printf("createWorker %d  received %c\n", id, n)
		go func() {
			w.done <- true
		}()
	}
}

func createWorker(id int) work {
	w := work{
		in:   make(chan int),
		done: make(chan bool),
	}
	go doWorker(id, w)
	return w
}

func chanDemo() {
	var works [10]work
	for i := 0; i < 10; i++ {
		works[i] = createWorker(i)
	}

	for i := 0; i < 10; i++ {
		works[i].in <- 'a' + i
	}

	for i := 0; i < 10; i++ {
		works[i].in <- 'A' + i
	}

	// 第一次执行
	for _, worker := range works {
		<-worker.done
		<-worker.done
	}

	//// 第二次执行
	//for _, worker := range works {
	//	<-worker.done
	//}
}
func main() {
	chanDemo()
}

如上代码,为什么for range 的时候要用两次<- worker.done?我两次执行都没有报错,只不过打印出来的值要少一些

正在回答 回答被采纳积分+3

1回答

俱乐部恶霸 2020-12-24 18:34:11

for i := 0; i < 10; i++ {
works[i].in <- 'a' + i
}

for i := 0; i < 10; i++ {
works[i].in <- 'A' + i
}

上面往channel写了20次

for _, worker := range works {
<-worker.done
<-worker.done
}

range workes只循环10次,所以执行两次<-worker.done才能把channel读完


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号