如果我有这样的包范围变量:
var (
bus *Bus // THIS VARIABLE
)
// Bus represents a repository bus. This contains all of the repositories.
type Bus struct {
UserRepository *UserRepository
// ...
}
...我可以访问我的存储库中的bus
变量,以便它们可以相互访问,如果它们可以同时使用,我是否需要使用任何类型的互斥?
将会发生什么的快速伪代码:
// Router
router.GET("/user/:id", c.FindUser)
// Controller
func (c *UserController) FindUser(w http.ResponesWriter, r *http.Request) {
w.Write([]byte(c.UserService.FindUser(r.Get("id"))))
}
// Service
func (s UserService) FindUser(id int) *domain.User {
return s.UserRepository.FindByID(id)
}
// Repository
func (r UserRepository) FindByID(id int) *domain.User {
// This is where the package-scope `bus` variable will be used
}
在FindByID
函数中,我可以使用包范围的bus
变量,当然可以同时访问该变量,因为只要HTTP请求触发它就会被调用,并且这些变量都被处理同时进行。
答案 0 :(得分:5)
如果您所做的只是读取变量的内容 - 那么不,您不需要互斥锁。但是,如果你改变它的状态,那么你需要保护它。
两次并发写入或并发写入和读取可能会导致问题。如果您的写入很少,则可能需要使用RWMutex。它允许多个读者访问,但不能与作者一起访问。
另外,请查看race detector。它是尽力而为的探测器,因此它不能保证您没有竞争条件,但它可以检测到一些用例。另请注意,您需要引发比赛才能让比赛探测器检测到它,因此必须编写同时使用bus
或模拟真实条件的测试。