2017-02-24 103 views
0

我想根据字符串为某些频道编制索引。我正在使用地图,但不允许我为其分配频道。我不断收到“恐慌:分配到无地图入口”,我错过了什么?Golang。频道地图

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

你用'make'或者地图文字初始化地图。也许要经过[“Go of Go”](https://tour.golang.org/),它涵盖了所有的基础知识。 – JimB

+0

只是一个小小的说明,以防万一:地图的零值为零。正如答案所述,你需要用'make'来初始化它# – threeve

回答

5

您需要首先初始化地图。例如:

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

另一件事,你发送并试图从一个无缓冲的通道消耗,所以程序将死锁。所以可能会使用缓冲通道或在goroutine中发送/消耗。

我这里使用的一个缓冲信道:

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://play.golang.org/p/DV_taMtse5

make(chan int, 2)部与为2的缓冲长度中缓冲的信道了解更多关于在这里:​​https://tour.golang.org/concurrency/3

+0

出于好奇,为什么你把'chan int'放在括号里?语法'make(map [string] chan int)'工作正常。 –

+0

即使像'map [string] chan int {}'也行得通。 –

+1

哦,它是在原来的代码。我修改了我必须修改的部分。 – masnun