Golang。频道地图

问题描述 投票:6回答:2

我想基于字符串为某些频道编制索引。我正在使用地图,但不允许我为其分配通道。我不断收到“恐慌:零地图中的条目分配”,我想念什么?

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

dictionary go channel
2个回答
10
投票

您需要先初始化地图。类似于:

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
投票

此外,您的代码可以简化为这个。为什么要不必要地传递参数!另外一项修改是,我采用了不同的值,以使您更清楚地理解该概念。

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.