地图频道的设计模式?

我正在用 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()在那里使用。


MM们
浏览 219回答 2
2回答

白衣非少年

通道缓冲区的长度不传达type,因此您必须添加逻辑来测试映射条目是否存在,如果不存在:tidMap[0] = make(chan int, 1)

慕村9548890

简短的回答:你不能。当你创建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 并不能确保发送者永远不会阻塞;如果您的频道消费者太慢,生产者可以将频道填满其容量,然后将阻塞,直到频道再次有空间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go