英文:
Golang are package block variables thread safe?
问题
根据Go规范:
“在顶层(任何函数之外)声明的常量、类型、变量或函数(但不包括方法)的标识符所表示的范围是包块。”
包块变量是否线程安全?例如,如果我有一个包块变量用于存储Web应用程序的当前用户:
var CurrentUser *string
请求1到达:将CurrentUser设置为“John”
请求2到达:将CurrentUser设置为“Fred”
在请求1中,CurrentUser的值是什么?
英文:
According to the Go spec:
"The scope of an identifier denoting a constant, type, variable, or function (but not method) declared at top level (outside any function) is the package block."
Are package block variables thread safe? E.G. If I have a package block variable to store the current user for a web app:
var CurrentUser *string
Request 1 comes in: Set CurrentUser to "John"
Request 2 comes in: Set CurrentUser to "Fred"
In Request 1 what is the value of CurrentUser?
答案1
得分: 5
不,包变量不是线程安全的。
在你的例子中,CurrentUser 可以在任何时候从 "John" 改变为 "Fred",尽管处理请求 1 的 goroutine 不一定会看到这个变化。
因此,你需要使用局部变量来存储对于不同的 goroutine 不同的数据。
英文:
No, package variables are not thread safe.
In your example, CurrentUser could change from "John" to "Fred" at any time—although the goroutine handling Request 1 is not guaranteed to see the change.
So you need to use a local variable to store any data that is different for different goroutines.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论