type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}
它在下面被称为
func (s *Stat) Count(name string) {
s.countersLock.RLock()
counter := s.counters[name]
s.countersLock.RUnlock()
if counter != nil {
atomic.AddInt64(counter, int64(1))
return
}
}
我的理解是,我们首先锁定接收器s(这是Stat类型),然后如果计数器确实存在,则将其添加。
问题:
Q1:为什么我们需要锁定它?RWMutex
甚至是什么意思?
问题2:s.countersLock.RLock()
-这是否会锁定整个接收器或仅锁定Stat类型的counters字段?
问题3:s.countersLock.RLock()
-这是否会锁定平均值字段?
问题4:为什么要使用RWMutex
?我以为通道是处理Golang中并发的首选方法?
问题5:这是什么atomic.AddInt64
。为什么在这种情况下我们需要原子的?
问题6:为什么要在添加之前立即解锁?
问题:
Q1:为什么我们需要锁定它?
RWMutex
甚至是什么意思?
RW代表读/写。CF文档:http :
//golang.org/pkg/sync/#RWMutex。
我们需要锁定它,以防止其他例程/线程在处理它时更改该值。
问题2:
s.countersLock.RLock()
-这是否会锁定整个接收器或仅锁定Stat类型的counters字段?
作为互斥锁,只有在调用RLock()
函数时才会发生锁定。如果任何其他goroutine已调用WLock()
,则它将阻塞。您可以RLock()
在同一goroutine中调用任意数量的代码,它不会锁定。
因此它不会锁定任何其他字段,甚至也不会s.counters
。在您的示例中,您锁定了地图查找以找到正确的计数器。
问题3:
s.countersLock.RLock()
-这是否会锁定平均值字段?
不,正如第二季度所说,RLock
只有他自己可以锁。
问题4:为什么要使用
RWMutex
?我以为通道是处理Golang中并发的首选方法?
频道非常有用,但有时不够用,有时没有意义。
在这里,当您锁定地图访问权限时,互斥锁才有意义。使用chan时,您必须具有1的缓冲chan,然后才发送和接收。不是很直观。
问题5:这是什么
atomic.AddInt64
。为什么在这种情况下我们需要原子的?
此函数将以原子方式递增给定变量。在您的情况下,您有一个竞态条件:counter
是一个指针,并且在释放锁之后和调用之前可以销毁实际变量atomic.AddInt64
。如果您不熟悉这种事情,我建议您坚持使用互斥锁,并在锁定/解锁之间进行所有需要的处理。
问题6:为什么要在添加之前立即解锁?
你不应该。
我不知道您要做什么,但这是一个(简单的)示例:https :
//play.golang.org/p/cVFPB-05dw
遍历文件夹,包括子目录 以下是简化的代码: 报错: undefined: walkFn 我不清楚如何定义一个正确的walkFn, 请问应该如何修改呢? 谢谢
问题内容: 如何使用正则表达式匹配URL,它确实决定使用相应的函数处理 问题答案: 不能用于注册模式以匹配正则表达式。简而言之,在处指定的模式可以匹配固定的,有根的路径(如)或有根的子树(如),较长的模式优先于较短的模式。您可以在该类型的文档中找到更多详细信息。 您可以做的是将您的处理程序注册到一个有根的子树,该子树可能包含该模式的所有内容,并且在您的处理程序内部,您可以进行进一步的正则表达式匹配
问题内容: Go对于此SQL查询中的第二个参数想要什么。我正在尝试在postgres中使用查找。 我真正想要的是: 问题答案: 查询只是使用varargs来替换sql中的参数,因此,在您的示例中,您只需要执行 例如,这个和第二个示例的内容是动态的,那么您将 如果“ IN”部分具有可变的args,则可以执行(播放)
问题内容: 我尝试了很多方法,例如 和 而且转义序列也不起作用 问题答案: 所有你需要的是 :
问题内容: 我正在尝试使用Go解析YAML文件。问题在于YAML文件中的密钥可能并不总是相同。这是为了进行API版本控制,以便用户可以定义他们支持的版本。例如V1,V2,V3等。它们不需要按顺序排列,并且可以省略它们不支持的版本,例如V0,V2,V5等。 这是最高层,我还没有从结构内部弄清楚如何做到这一点。 问题答案: 首先,您尝试将根解析为,但其实际类型为。其次,如果要保留该类型结构,则需要一个
问题内容: 嗨,我正在尝试执行脚本以使用Golang将数据填充到数据库中 问题是我遇到了错误: 我认为问题是执行人员认为是dbname的最后一个参数(sql脚本路径) 终端中的以下命令正在运行: 但我尝试在Go中复制以自动执行脚本。 该脚本具有删除表,创建表,插入和具有FK关系的PK,这是一个非常完整的脚本,因此我无法逐行执行,因此我决定执行de mysql程序以将数据插入数据库中。 有什么建议?