为了账号安全,请及时绑定邮箱和手机立即绑定

地图频道的设计模式?

地图频道的设计模式?

Go
MM们 2021-07-07 14:05:00
我正在用 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 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

通道缓冲区的长度不传达type,因此您必须添加逻辑来测试映射条目是否存在,如果不存在:

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


查看完整回答
反对 回复 2021-07-19
?
慕村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 并不能确保发送者永远不会阻塞;如果您的频道消费者太慢,生产者可以将频道填满其容量,然后将阻塞,直到频道再次有空间。


查看完整回答
反对 回复 2021-07-19
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信