【发布时间】:2021-12-10 22:19:50
【问题描述】:
我是 Golang 的新手,我很难弄清楚为什么下面的代码会产生死锁。另外,我该如何修复它才能正常工作?
package main
import "fmt"
func main() {
m := make(map[int]chan string)
go func() {
m[0] = make(chan string)
m[0] <- "abab"
}()
fmt.Println(<-m[0])
}
编辑:
感谢您的回答!不幸的是,用
初始化m[0]
m[0] = make(chan string)
在启动一个新的 goroutine 之前并不是我想要的。我的问题是:有没有办法“动态”创建频道?例如。我有一张map[int]chan string 类型的地图m,并且我收到包含id 类型int 之类的请求。我想通过频道map[id] 发送消息,但是为每个int 初始化频道成本太高。我该如何解决/解决这个问题?
因此,换句话说,我想为每个id 建立一个单独的作业队列,并懒惰地初始化每个队列。
【问题讨论】:
-
您认为语句的执行顺序是什么?提示:在你的
<-m[0]之前添加time.Sleep(time.Second)可以修复你的程序(错误的方式)。 -
@mkopriva 好的,谢谢!有没有办法“动态”创建频道?例如。我有一张
m类型为map[int]chan string的地图,我收到包含id类型int之类的请求。我想通过频道map[id]发送消息,但是为每个int初始化频道成本太高。我该如何解决/解决这个问题?
标签: go concurrency deadlock