Как получить «дескриптор» канала без ассоциированного типа - PullRequest
0 голосов
/ 25 марта 2019

У меня есть серверная часть (сервер Go), которая обслуживает несколько внешних интерфейсов (веб-страниц), и все запросы / ответы обрабатываются по каналам определенных типов.Например, каждый внешний интерфейс связан (на внутреннем сервере) с каналом, на который отправляются ответы (type = chan <- Response). </p>

Недавно я внедрил систему входа в систему, где каждый внешний интерфейс связан с идентификатором пользователя.Чтобы отслеживать пользователей, у меня есть карта:

logins map[chan<- Response]LoginData

. С ее помощью я могу быстро искать вещи, связанные с внешним интерфейсом, такие как права доступа.Все это прекрасно работает.

Однако, чтобы сделать вещи более безопасными и более модульными, я переместил все элементы входа в отдельный пакет.Это все работает, за исключением одной ошибки - карта логинов имеет ключ типа «chan <- Response», но тип Response определен в моем основном пакете, и я не хочу показывать его в пакете Login.(Я не думаю, что мог бы так или иначе, поскольку это создало бы круговую ссылку.) </p>

Я только хочу использовать "chan <- Response" как тип дескриптора в пакете входа в систему - мне не нужнонаписать на этот канал оттуда.Я попытался преобразовать канал в unsafe.Pointer, но это не разрешено компилятором.С другой стороны, я не могу использовать указатель на переменную канала (* chan <- Response) в качестве дескриптора, поскольку канал хранится в нескольких местах, поэтому переменная канала будет иметь разные адреса. </p>

Я такжепопытался привести к другому типу chan, такому как chan int и chan interface {}, но компилятору это не понравилось.Кажется, нет никакого способа преобразовать канал в «общий» канал.

Я действительно просто хочу адрес внутренних данных канала - как вы получаете, когда вы fmt.Printf канал с% v,Лучшее, что я могу придумать, это использовать такую ​​строку:

var c chan<- Response = ...
var userID = "steve"
loginKey = fmt.Sprint(c)
Login.Add(loginKey, userID)

Я не уверен, что это правильно, но, похоже, работает, но мне кажется, что должен быть лучший способ.

1 Ответ

0 голосов
/ 25 марта 2019

С другой стороны, я не могу использовать указатель на переменную канала (* chan <- Response), поскольку дескриптор канала хранится в нескольких местах, поэтому переменная канала будет иметь разные адреса. </p>

Но это единственное (на полпути приемлемое решение): не пропускайте chan Response, а *(chan Response) (добавляя указания по своему вкусу). Все остальное дерьмо. Лучше всего скрыть этот ответ Чаня в типе.

...