我有一些应该增加计数的代码。
这是包含计数变量的结构:
type PipelineData struct {
nodeData map[string]map[string]int
lastBurstResults map[string]map[string]string
burstReady map[string]bool
lastExecutionTime map[string]time.Time
currentNodeSize uint64
}
如您所见,有一个名为 currentNodeSize
的成员。此变量旨在每次调用函数 addNodeData
时递增。您可以看到函数 addNodeData
调用函数 addCount
然后使用原子增量器。
func (p PipelineData) addNodeData(key string) {
nodeSlot := clusterScenario.GetNodeSlotByHashSlot(key)
i:=p.nodeData[nodeSlot][key]
i++
p.nodeData[nodeSlot][key]=i
p.addCount()
fmt.Println("Adding node count ",p.currentNodeSize)
}
func (p PipelineData) addCount(){
atomic.AddUint64(&p.currentNodeSize, 1)
}
不幸的是,当我运行这个时:
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
Dump(p.currentNodeSize)
输出为0
。
这里是 PipelineData 结构的初始化:
p = &PipelineData{
nodeData:make(map[string]map[string]int,0),
lastBurstResults:make(map[string]map[string]string,0),
burstReady:make(map[string]bool,0),
lastExecutionTime:make(map[string]time.Time,0),
currentNodeSize:0,
}
for i,_ := range clusterScenario.masterNodes{
p.nodeData[i]=make(map[string]int,0)
}
我了解社区要求我进行研究。我不确定此时该做什么。任何帮助将不胜感激。
我还尝试了使用变量的通用增量器并产生了相同的结果,这就是我尝试原子增量器的原因
最佳答案
addCount
采用值接收器,而不是指针,因此它对结构的副本进行操作,增加副本的字段,然后丢弃副本。改为采用指针:
func (p *PipelineData) addCount(){
这应该可以解决您的问题。
关于go - 增量器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598032/