2016-04-12 9 views
1

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) 
} 

私の出力は、次のとおりです。[BARF [マップ:5]]

+2

あなたはチャンネルから一度だけ受信しますので、 – hobbs

+0

#facepalmありがとうhobbs! – pjonesdotca

答えて

3

データがそれに書かれているようあなたは、連続チャネルからの読み込みする必要があります。そして、データをチャンネルにポンピングしたら、それを閉じます。それがどのように機能するかは次のとおりです。

注:AddToMapは独立したゴルーチンとして呼び出されていません。私たちがチャネルcを閉じる必要がある時を知る必要があるので、waitgroupを使って行うことができます。これはすべて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) 
} 
関連する問題