【发布时间】:2019-08-15 10:51:54
【问题描述】:
我有一个后端(Go 服务器),它为多个前端(网页)提供服务,所有请求/响应都通过特定类型的通道处理。例如,每个前端(在后端)与发送响应的通道相关联(类型 = chan
我最近实现了一个登录系统,其中每个前端都与一个用户 ID 相关联。为了跟踪用户,我有一张地图:
logins map[chan<- Response]LoginData
使用它,我可以快速查找与前端相关的内容,例如权限。这一切都很好。
但是,为了让事情更安全和更模块化,我已将所有登录内容移至单独的包中。这一切都有效,除了一个问题 - 登录映射由类型“chan
我只想使用“chan
我还尝试转换为不同类型的 chan,例如 chan int 和 chan interface{},但编译器不喜欢这样。似乎没有任何方法可以将频道转换为“通用”频道。
我真的只想要通道内部数据的地址——就像你在 fmt.Printf 一个带有 %v 的通道时得到的那样。我能想到的最好的方法是使用这样的字符串:
var c chan<- Response = ...
var userID = "steve"
loginKey = fmt.Sprint(c)
Login.Add(loginKey, userID)
我不确定这是否有效,但似乎可行,但在我看来应该有更好的方法。
【问题讨论】:
-
你可以使用
interface {}作为类型 -
“响应类型在我的主包中定义” - 这是一个设计缺陷。
main包应该尽可能少做,并且它绝对不应该定义类型,这正是您在此处看到的原因。 -
感谢@Adrian 的阅读和理解(而不是否决我认为合理的问题:)。我完全同意你的评论,但这个项目是作为一个主要的包开始的,并且不断发展壮大。我一直在尝试将它的一部分分成内部包(如在这个问题中)我会听取您的建议并尝试找出如何将类型移动到单独的包中。