我正在用 golang 编写 DNS 协议解析器,想法是使用这样的映射var tidMap map[uint16] (chan []byte)所以对于tidMap地图来说,key 是 tid(事务 ID),value 是一个字节数组通道。这个想法是一个 goroutine 将尝试从通道获取值,另一个 goroutine 将尝试通过侦听每个传入的数据包来读取字节,一旦找到事务 ID,就会将响应数据设置到 tidMap,因此前一个 goroutine 将继续处理响应。设计的一个问题是我需要确保通道的缓冲区长度为 1,因此可以将额外的值推送到通道中而不会阻塞。那么如何在tidMap声明中指定通道缓冲区长度呢?var tidMap map[int] make(chan int, 1)你不能make()在那里使用。
2 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
简短的回答:你不能。当你创建make一个映射时,你定义了它的键和值的数据类型,一个通道的容量不是它的类型的一部分。
更长的答案是:创建一个隐藏此实现细节的抽象数据类型。像这样的东西:
type ChannelMap struct {
tidMap map[int](chan []byte)
}
func NewChannelMap() *ChannelMap { ... }
func (c *ChannelMap) Put(tid int) (chan int) {
res := make(chan int, 1)
c.tidMap[tid] = res
return res
}
func (c *ChannelMap) Get(tid int) (chan int) {
return c.tidMap[tid]
}
并且可以肯定的是:将通道的容量设置为 1 并不能确保发送者永远不会阻塞;如果您的频道消费者太慢,生产者可以将频道填满其容量,然后将阻塞,直到频道再次有空间。
- 2 回答
- 0 关注
- 218 浏览
添加回答
举报
0/150
提交
取消