У меня есть серверная часть (сервер 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)
Я не уверен, что это правильно, но, похоже, работает, но мне кажется, что должен быть лучший способ.