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