2017-02-24 9 views
0

文字列に基づいていくつかのチャンネルをインデックスしたいと思います。私はマップを使用していますが、チャンネルを割り当てることはできません。私は「パニック:無制限マップのエントリへの割り当て」を続けています。何が欠けていますか?あなたが最初のマップを初期化する必要がゴラン。チャンネルのマップ

package main 

import "fmt" 

func main() { 
    var things map[string](chan int) 
    things["stuff"] = make(chan int) 
    things["stuff"] <- 2 
    mything := <-things["stuff"] 
    fmt.Printf("my thing: %d", mything) 
} 

https://play.golang.org/p/PYvzhs4q4S

+4

を:https://play.golang.org/p/DV_taMtse5

make(chan int, 2)部分が2のバッファ長を用いて緩衝チャネルはここでそれについての詳細をお読みになり'make'やマップリテラルを使ってマップを初期化します。たぶん、すべての基本をカバーする[Go of Tour](https://tour.golang.org/)を見てください。 – JimB

+0

ちょっとした説明:マップのゼロ値がゼロです。答えは、 'make 'で初期化する必要があります。 – threeve

答えて

5

。何かのように:

things := make(map[string](chan int)) 

もう一つは、あなたが送信し、バッファリングされていないチャンネルから消費しようとすると、そのプログラムがデッドロックされますしています。だから、バッファリングされたチャンネルを使うことも、ゴルーチンで送る/消費することもできます。

私はここでバッファリングされたチャネルを使用:

package main 

import "fmt" 

func main() { 
    things := make(map[string](chan int)) 

    things["stuff"] = make(chan int, 2) 
    things["stuff"] <- 2 
    mything := <-things["stuff"] 
    fmt.Printf("my thing: %d", mything) 
} 

遊び場リンク:https://tour.golang.org/concurrency/3

+0

好奇心の疎かに、なぜ' chan int'をかっこに入れましたか? 'make(map [string] chan int)'の構文はうまくいきます。 –

+0

'map [string] chan int {}'のようなものでも動作します。 –

+1

ああ、元のコードです。私は修正しなければならなかった部分だけを修正しました。 – masnun