小编lmo*_*org的帖子

去没有goroutines覆盖的全局变量

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

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

我猜通道不会这样做?从我可以收集的内容(如果我在这里错了,请纠正我),但它们基本上只是一种共享全局变量的安全方式?

编辑:我忘记了这个问题!无论如何,任何好奇的人的更新.这个问题是在我刚开始使用Go时回写的,而CMS基本上是我的第一个项目.我来自熟悉POSIX线程的C背景,但我很快意识到更好的方法是在模式功能设计中编写代码,将会话对象作为函数参数中的指针传递下来.这给了我我所关注的上下文敏感的本地范围,同时也最小化了我复制的数据量.然而,作为一个7岁的项目和一个刚开始转向Go的项目,可以说该项目无论如何都可以进行重大改写,因为存在很多错误.这是另一天的关注 - 目前它有效,而且我还有足够的其他项目.

concurrency go

7
推荐指数
1
解决办法
7473
查看次数

使用函数名称作为参数

在Go中,您可以将函数作为参数传递callFunction(fn func).例如:

package main

import "fmt"

func example() {
    fmt.Println("hello from example")
}

func callFunction(fn func) {
    fn()
}    

func main() {
    callFunction(example)
}
Run Code Online (Sandbox Code Playgroud)

但是当它是结构的成员时,是否可以调用函数?以下代码将失败,但为您提供我正在谈论的内容的示例:

package main

import "fmt"

type Example struct {
    x int
    y int
}

var example Example

func (e Example) StructFunction() {
    fmt.Println("hello from example")
}

func callFunction(fn func) {
    fn()
}    

func main() {
    callFunction(example.StructFunction)
}
Run Code Online (Sandbox Code Playgroud)

(我知道我在这个例子中想做的事情有点奇怪.我所遇到的确切问题并没有很好地缩小到一个简单的例子,但这是我问题的本质.但我也很感兴趣这从学术角度来看)

methods struct types go first-class-functions

2
推荐指数
1
解决办法
149
查看次数

标签 统计

go ×2

concurrency ×1

first-class-functions ×1

methods ×1

struct ×1

types ×1