【问题标题】:How to obtain a channel "handle" without an associated type如何获取没有关联类型的通道“句柄”
【发布时间】: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 的阅读和理解(而不是否决我认为合理的问题:)。我完全同意你的评论,但这个项目是作为一个主要的包开始的,并且不断发展壮大。我一直在尝试将它的一部分分成内部包(如在这个问题中)我会听取您的建议并尝试找出如何将类型移动到单独的包中。

标签: go channel


【解决方案1】:

另一方面,我不能使用指向通道变量 (*chan

但这是唯一的(可以接受的解决方案):不要传递chan Response,而是传递*(chan Response)(根据自己的喜好添加方向)。其他的都是废话。最好的办法是将这个 chan Response 隐藏在一个类型中。

【讨论】:

  • 谢谢。你是对的,拥有一个 chan 变量并传递一个指向它的指针应该很容易。这似乎有点多余,因为我认为通道变量本质上只是指向真实通道的指针。我同意最好的办法是创建一个新类型,但是在我的 Login 包中声明它没有什么意义,而且我不能在主包(循环引用)中声明它,所以我想我需要把它放在一个新的我导入到主包和登录包中的包。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2014-05-22
  • 1970-01-01
  • 2014-11-30
相关资源
最近更新 更多