【问题标题】:How to populate an array with channels in go如何在 go 中使用通道填充数组
【发布时间】:2016-08-02 11:35:27
【问题描述】:

我正在尝试使用 go 通道构建一个数组。我不关心广告订单,但我只收到来自频道的最后一项。

package main

import (
    "fmt"
)

func AddToMap(thing string, val string, c chan map[string]string) {
    mappy := make(map[string]string)
    mappy[thing] = val
    c <- mappy
}

func main() {
    item := make([]map[string]string, 0, 10)
    list1 := []string{"foo", "bar", "baz", "blah", "barf"}
    list2 := []string{"one", "two", "three", "four", "five"}
    c := make(chan map[string]string)
    for index, val := range list1 {
    go AddToMap(val, list2[index], c)
}
    ret := <-c
    item = append(item, ret)
    fmt.Println(item)
}

我的输出是:[map[barf:five]]

【问题讨论】:

  • 你只能从频道收到一次,所以...
  • #facepalm 谢谢霍布斯!

标签: go channels


【解决方案1】:

您需要从通道中连续读取数据,因为数据正在写入其中。当您完成将数据泵入通道时,请关闭它。这是它的工作原理。

注意:AddToMap 不是作为独立的 goroutine 调用的。可以使用 waitgroup 来完成,因为我们需要知道何时需要关闭通道 c,这将在所有 AddToMap 运行之后。

package main

import (
    "fmt"
)

func AddToMap(thing string, val string, c chan map[string]string) {
    mappy := make(map[string]string)
    mappy[thing] = val
    c <- mappy
}

func main() {
    item := make([]map[string]string, 0, 10)
    list1 := []string{"foo", "bar", "baz", "blah", "barf"}
    list2 := []string{"one", "two", "three", "four", "five"}
    c := make(chan map[string]string)
    go func(){
        for index, val := range list1 {
            AddToMap(val, list2[index], c)
        }
        close(c)
    }()
    for ret := range c {
        item = append(item, ret)
    }
    fmt.Println(item)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 2019-07-28
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多