错误"范围内的变量太多"在迭代通道时

时间:2018-06-14 15:58:12

标签: for-loop go channel

我有点迷失在这里,我试图让一个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")
}

1 个答案:

答案 0 :(得分:5)

当您在通道上进行范围调整时,迭代只会生成一个值,即在通道上发送的值。没有像切片或地图那样的索引或键值。

所以你必须使用:

for v := range c {
    fmt.Println("Received", v)   
}

详见Spec: For statements:

  

如果范围表达式是一个通道,则最多允许一个迭代变量,否则最多可能有两个。

  

对于通道,生成的迭代值是通道上发送的连续值,直到通道为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