根据Go规范:
“在顶层(在任何函数之外)声明的表示常量,类型,变量或函数(但不是方法)的标识符的范围是包块。”
包块变量是否安全?例如。如果我有一个包块变量来存储Web应用程序的当前用户:
var CurrentUser *string
请求1进来:将CurrentUser设置为“John” 请求2进来:将CurrentUser设置为“Fred”
在请求1中,CurrentUser的值是什么?
答案 0 :(得分:5)
不,包变量不是线程安全的。
在您的示例中,CurrentUser可以随时从“John”更改为“Fred” - 尽管goroutine处理请求1不是保证以查看更改。
因此,您需要使用局部变量来存储不同goroutine的不同数据。