gpt4 book ai didi

go - 如何在没有关联类型的情况下获取 channel "handle"

转载 作者:数据小太阳 更新时间:2023-10-29 03:41:50 28 4
gpt4 key购买 nike

我有一个后端(Go 服务器),它为多个前端(网页)提供服务,所有请求/响应都通过特定类型的 channel 处理。例如,每个前端(在后端)与发送响应的 channel 相关联(type = chan<- Response)。

我最近实现了一个登录系统,其中每个前端都与一个用户 ID 相关联。为了跟踪用户,我有一张 map :

logins map[chan<- Response]LoginData

使用它我可以快速查找与前端相关的内容,例如权限。这一切都很好。

但是,为了让事情更安全和更模块化,我将所有登录内容移到了一个单独的包中。这一切都有效,除了一个陷阱 - 登录映射由类型“chan<- Response”键入,但 Response 类型在我的主包中定义,我不想将它暴露给登录包。 (我不认为我可以,因为它会创建一个循环引用。)

我只想使用“chan<- Response”作为登录包中的句柄类型——我不需要从那里写入该 channel 。我尝试将 channel 转换为 unsafe.Pointer,但编译器不允许这样做。另一方面,我不能使用指向 channel 变量 (*chan<- Response) 的指针作为句柄,因为 channel 存储在多个位置,因此 channel 变量将具有不同的地址。

我还尝试转换为不同类型的 chan,例如 chan int 和 chan interface{},但编译器不喜欢那样。似乎没有任何方法可以将 channel 转换为“通用” channel 。

我真的只想要 channel 内部数据的地址——就像你在 fmt.Printf 一个带有 %v 的 channel 时得到的那样。我能想到的最好办法是使用这样的字符串:

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

我不确定这是否有效但似乎有效,但在我看来应该有更好的方法。

最佳答案

On the other hand I can't use a pointer to the channel variable (*chan<- Response) as the handle as the channel is stored in several places so the channel variable will have different addresses.

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

关于go - 如何在没有关联类型的情况下获取 channel "handle",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55333707/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com