7

我正在用 Go 编写一个 CMS,并且有一个会话类型(用户 ID、要呈现的页面内容等)。理想情况下,我希望该类型成为全局变量,因此我不必通过所有嵌套函数传播它,但是拥有这样的全局变量显然意味着每个新会话都会覆盖它的前任,这不必要说,将是史诗般的失败。

一些语言提供了一种在线程内保存全局变量的方法(即,该全局变量的值在该线程内被沙箱化)。虽然我知道 Goroutine 不是线程,但我只是想知道是否有类似的方法可供我使用,或者我是否必须通过各种嵌套例程向下传递会话类型的本地指针。

我猜频道不会这样做?据我所知(如果我在这里错了,请纠正我),但它们基本上只是一种共享全局变量的安全方式?

编辑:我忘记了这个问题!无论如何,任何好奇的人的更新。这个问题是我刚接触 Go 时写的,CMS 基本上是我的第一个项目。我来自熟悉 POSIX 线程的 C 背景,但我很快意识到更好的方法是在模式功能设计中编写代码,会话对象作为函数参数中的指针向下传递。这为我提供了我所追求的上下文相关的本地范围,同时也最大限度地减少了我正在复制的数据量。然而,作为一个有 7 年历史的项目,也是我开始过渡到 Go 的一个项目,可以公平地说,该项目无论如何都可以进行重大重写,因为犯了很多错误。不过,这是另一天的担忧——目前它有效,而且我还有足够多的其他项目在进行中。

4

3 回答 3

4

你会想要使用类似的东西Context

http://blog.golang.org/context

Context基本上,该模式是为您想做的每件独特的事情创建一个。(在您的情况下是一个 Web 请求。)用于context.WithValue在上下文中嵌入多个变量。然后总是将它作为第一个参数传递给在其他 goroutine 中做进一步工作的其他方法。

context.Value从上下文中获取所需的变量是从任何 goroutine中调用的问题。从上面的链接:

AContext对于多个 goroutine 同时使用是安全的。代码可以将单个传递Context给任意数量的 goroutine 并取消它Context以向所有 goroutine 发出信号。

我有一个实现,我明确地将变量作为方法参数发送,我发现使用上下文嵌入这些变量可以显着清理我的代码。

使用 aContext也有帮助,因为它提供了通过使用通道、select和称为“完成通道”的概念来结束长时间运行的任务的方法。请参阅这篇文章以获得出色的基本审查和实施:

http://blog.golang.org/pipelines

我建议先阅读管道文章,以了解如何管理 goroutine 之间的通信,然后阅读上下文文章,以更好地了解如何升级并开始嵌入变量以进行传递。

祝你好运!

于 2014-08-13T16:03:08.003 回答
1

如果您有多个用户,那么您是否不需要每个连接的信息?所以我认为每个连接的用户都有一个结构。在设置工作 goroutine 或通过通道传递指针时,将指针传递给该结构将是惯用的 Go。

于 2013-04-04T05:50:07.387 回答
1

不要使用全局变量。使用 Go goroutine-local 变量。

go-routine ID..

已经有 goroutine-local 变量:它们被称为函数参数、函数返回值和局部变量。

拉斯

于 2013-04-02T21:47:24.247 回答