2014-01-23 5 views
0

Я пишу анализатор протокола DNS в golang, идея заключается в том, чтобы использовать карту как этотДизайн шаблонов для канала карты?

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

Так что для tidMap карты, ключ является TID (идентификатор транзакции), значение канала массива байт.

Идея состоит в том, что goroutine попытается получить значение из канала, другой goroutine попытается прочитать байты, прослушивая каждый входящий пакет, и как только он найдет идентификатор транзакции, задает данные ответа в tidMap, поэтому прежний goroutine продолжит обрабатывать ответ.

Одна из проблем с дизайном заключается в том, что мне нужно убедиться, что канал имеет длину буфера 1, поэтому дополнительные значения могут быть введены в канал без блокировки.

Итак, как я могу указать длину буфера канала в декларации tidMap?

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

Здесь вы не можете использовать make().

ответ

1

Длина буфера канала не передает типа, так что вам придется добавить логику, чтобы проверить, если запись существует на карте, если он не делает:

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

хорошо я понял это ! http://play.golang.org/p/-zT8vLvBff Основным препятствием является то, что я постоянно пытаюсь использовать '<-' вместо' = 'при назначении значений, поэтому застрял, потому что не где указать длину буфера. – est

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 делает не гарантировать, что отправители никогда не будет блокировать; если ваши каналы слишком медленны, производители могут заполнить канал до его емкости, а затем заблокировать до тех пор, пока канал снова не закроется.

Смежные вопросы