我有一个后端(Go服务器),该后端为多个前端(网页)提供服务,并且所有请求/响应都通过特定类型的通道进行处理。例如,每个前端(在后端)都与发送响应的通道关联(类型= chan <-Response)。
我最近实现了一个登录系统,其中每个前端都与一个用户ID相关联。为了跟踪用户,我有一张地图:
logins map[chan<- Response]LoginData
使用它,我可以快速查找与前端相关的内容,例如权限。一切正常。
但是,为了保持安全和模块化,我将所有Login内容移到了单独的程序包中。除一个陷阱外,所有其他方法均有效-登录映射由类型“ chan <-Response”作为键,但是Response类型在我的主程序包中定义,并且我不想将其公开给Login程序包。 (我认为无论如何我都做不到,因为它会创建一个循环引用。)
我只想在登录包中使用“ chan <-Response”作为句柄类型-我不需要从那里写入该通道。我尝试将通道转换为unsafe.Pointer,但是编译器不允许这样做。另一方面,由于通道存储在多个位置,因此无法使用指向通道变量(* chan <-Response)的指针作为句柄,因此通道变量将具有不同的地址。
我也尝试过转换为不同类型的chan,例如chan int和chan interface {},但是编译器不喜欢这样。似乎没有任何方法可以将频道转换为“通用”频道。
我真的只想要通道内部数据的地址-就像您在使用%v fmt.Printf通道时得到的那样。我能想到的最好的方法是使用这样的字符串:
var c chan<- Response = ...
var userID = "steve"
loginKey = fmt.Sprint(c)
Login.Add(loginKey, userID)
我不确定这是否有效,但似乎可行,但在我看来应该有更好的方法。
答案 0 :(得分:0)
另一方面,由于通道存储在多个位置,因此我不能使用指向通道变量(* chan <-Response)的指针作为句柄,因此通道变量将具有不同的地址。
但这是唯一的(中途可以接受的解决方案):不要绕过chan Response
,而要绕过*(chan Response)
(根据自己的喜好添加方向)。其他一切都是胡扯。最好的办法是将此chan响应隐藏为一种类型。