我想基于字符串为某些频道编制索引。我正在使用地图,但不允许我为其分配通道。我不断收到“恐慌:零地图中的条目分配”,我想念什么?
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)
}
您需要先初始化地图。类似于:
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
此外,您的代码可以简化为这个。为什么要不必要地传递参数!另外一项修改是,我采用了不同的值,以使您更清楚地理解该概念。
package main
import (
"log"
"sync"
)
func put(hash chan int, wg *sync.WaitGroup) {
defer wg.Done()
log.Println("Put sent: ", <-hash)
}
func main() {
hashMap := map[string]chan int{}
key := "xyz"
var wg sync.WaitGroup
hashMap[key] = make(chan int, 5)
for i := 0; i < 5; i++ {
value := i
wg.Add(1)
go func(val int) {
hashMap[key] <- val
put(hashMap[key], &wg)
}(value)
}
wg.Wait()
}