来源:《Go 夜读》微信群
时间:2018-05-23
type ExecuterList struct {
sync.Map
length int
}
func (e ExecuterList) Get(key string) IExecuter {
value, ok := e.Load(key)
if !ok {
return nil
}
if value == nil {
return nil
}
res, _ := value.(IExecuter)
return res
}
使用 go tool vet
,出现“Get passes lock by value: ExecuterList contains sync.Map contains sync.Mutex”, 解决方案有两种:。
1,sync.Map用指针
type X struct {
*sync.Map
}
2, 也可以用 (e *ExecutorList)
,避免锁的复制。
为什么会失效呢?
因为你每次操作都复制了一遍整个struct,当然也复制了Map里面的Mutex,多线程同时读写时Map里面的锁相当于失效了。理解这个你需要知道的知识点有两个,一是go的参数都是值传递,二是只有用同一把锁才能对某个资源边界进行锁与解锁的操作。
rpc 可以封装程序间网络通信层,服务间调用只需要关注目标服务是什么,不用关心我到底用什么协议和数据格式了。