地图频道的设计模式?

时间:2014-01-23 06:30:01

标签: go channel goroutine

我在golang中编写DNS协议解析器,想法是使用这样的地图

var tidMap map[uint16] (chan []byte)

因此对于tidMap映射,key是tid(事务ID),value是字节数组通道。

这个想法是goroutine会尝试从通道获取值,另一个goroutine将通过监听每个imcoming数据包来尝试读取字节,并且一旦找到事务ID,就会将响应数据设置为tidMap,因此前goroutine将继续处理回应。

设计的一个问题是我需要确保通道的缓冲区长度为1,因此可以将额外的值推入通道而不会阻塞。

那么如何在tidMap声明中指定通道缓冲区长度?

var tidMap map[int] make(chan int, 1)

您无法在那里使用make()

2 个答案:

答案 0 :(得分:1)

通道缓冲区的长度不会传递类型,因此您必须添加逻辑来测试地图条目是否存在,如果它不存在:

tidMap[0] = make(chan int, 1)

答案 1 :(得分:0)

简短的回答:你做不到。当您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的容量确保发件人永远不会阻止;如果您的频道消费者太慢,制作人可以填充频道到其容量,然后阻止直到频道再次有空间。