我有点迷失在这里,我试图让一个goroutine添加到一个阵列和另一个goroutine来读取它,我怀疑它有点接近我下面但我需要玩与wait()。
但是,我收到错误prog.go:19:14: too many variables in range
,第19行是for _, v := range c {
我无法在线找到答案,我在做什么或不在这里做什么?
package main
import (
"fmt"
//"time"
"sync"
)
func hello(wg *sync.WaitGroup, s []int, c chan int) {
for _, v := range s {
c <- v
}
fmt.Println("Finished adding to channel")
wg.Done()
}
func hello2(wg *sync.WaitGroup, c chan int) {
fmt.Println("Channel",c)
for _, v := range c {
fmt.Println("Received",v)
}
fmt.Println("Finished taking from channel")
wg.Done()
}
func main() {
s := []int{1, 2, 3, 4, 5}
var c = make(chan int, 5)
var wg sync.WaitGroup
wg.Add(1)
go hello(&wg, s, c)
wg.Wait()
wg.Add(1)
go hello2(&wg, c)
wg.Wait()
//time.Sleep(1 * time.Second)
fmt.Println("main function")
}
答案 0 :(得分:5)
当您在通道上进行范围调整时,迭代只会生成一个值,即在通道上发送的值。没有像切片或地图那样的索引或键值。
所以你必须使用:
for v := range c {
fmt.Println("Received", v)
}
如果范围表达式是一个通道,则最多允许一个迭代变量,否则最多可能有两个。
和
对于通道,生成的迭代值是通道上发送的连续值,直到通道为closed。如果通道为
nil
,则范围表达式将永久阻止。
还有:
每次迭代计算左侧的函数调用一次。对于每次迭代,如果存在相应的迭代变量,则按如下方式生成迭代值:
Range expression 1st value 2nd value array or slice a [n]E, *[n]E, or []E index i int a[i] E string s string type index i int see below rune map m map[K]V key k K m[k] V channel c chan E, <-chan E element e E