代码如下:
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
c := make(chan bool, 10)
for i := 0; i < 10; i++ {
go Go(c, i)
}
for i := 0; i < 10; i++ { //如何使用`for-range`循环实现?
<-c
}
}
func Go(c chan bool, index int) {
a := 0
for i := 0; i < 10000000; i++ {
a += i
}
fmt.Println(index, a)
c <- true
}
求解。
有疑问加站长微信联系(非本文作者)

这里不适合用range,因为需要配合close,但是找不到合适的地方去close channel
package main
import ( "fmt" "runtime" )
func main() { runtime.GOMAXPROCS(runtime.NumCPU()) cs := make([]chan bool, 10) for i := 0; i < 10; i++ { cs[i] = make(chan bool, 1) go Go(cs[i], i) } for _, c := range cs { <-c } }
func Go(c chan bool, index int) { a := 0 for i := 0; i < 10000000; i++ { a += i } fmt.Println(index, a)
}
改成slice试试?
#2 楼 @abin 谢谢,是个办法
#1 楼 @stevewang 明白了,谢谢
for len(queue) > 0 { value := <-queue fmt.Println(value) }
还是七楼优雅,利用了close的特性。如果wg的代码放在一起,而不是“defer wg.Done()"放在Go函数中,就更符合习惯。需调整部分:
看了下你的代码,我觉得你的代码的意图是,创建一个bool的chan 每个线程结束通知这个通道。 然后再通过遍历这个通道来达到等待所有线程都执行结束的目的。 但是完全不需要用到通道。直接用WaitGroup就行了。 不知道你是否这个意图。至少你代码展现是这个意图。 以下使用WaitGroup的例子。
package main