Go 增强器不能工作

Go 增强器不能工作,go,increment,Go,Increment,我有一些应该增加计数的代码 以下是包含count变量的结构: type PipelineData struct { nodeData map[string]map[string]int lastBurstResults map[string]map[string]string burstReady map[string]bool lastExecutionTime map[string]time.Time currentN

我有一些应该增加计数的代码

以下是包含count变量的结构:

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(){

这应该可以解决您的问题。

如果不使用原子操作,就无法安全地读取
currentNodeSize
值。但是,这里没有理由使用原子操作,因为调用
addCount
的方法不能安全地同时使用。@JimB感谢您提供的信息