golang 中的函数变量是否并发安全?

Are function variables concurrency-safe in golang?

我声明了以下类型

type TestFn func(id int, ctx context.Context) error

var Func1 = TestFn(func(id int, ctx context.Context) error {
  // do some work -- the execution block is concurrent safe
}

var Func2 = TestFn(func(id int, ctx context.Context) error {
  // do some work
}

var Func3 = TestFn(func(id int, ctx context.Context) error {
  // do some work
}

func Execute()
   for i := 0; i < 5; i++ {
      go Func1(i, ctx)
      go Func2(i, ctx)
      go Func3(i, ctx)
   }
}

由于Func1Func2Func3是全局变量并分配给函数,我可以运行在具有不同参数的多个go例程中使用相同的函数吗?

规则很简单:对于来自多个 goroutine(没有同步)的并发访问,其中至少一个访问是写入,没有任何值是安全的。

你的例子只读取函数变量,所以是安全的。如果有一个 goroutine 运行 与 Execute() 的执行并发修改函数变量,那将是不安全的。但这在您的示例中不会发生。

注意:您的函数变量当然是在包初始化期间写入一次。这发生在 main() 开始之前的单个 goroutine 中。

是的,您的代码有效。


如果一个 goroutine 试图重新分配 FuncXX 的值,而另一个 goroutine 试图启动相同的 FuncXX - 这将是一个竞争条件。