代码之家  ›  专栏  ›  技术社区  ›  somejkuser

增量器不工作

  •  -2
  • somejkuser  · 技术社区  · 7 年前

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

    以下是包含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 被称为。你可以看到函数 地址数据 调用函数 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)
    }       
    

    我知道社区要求我做研究。我现在不知道该怎么办。任何帮助都将不胜感激。

    我还使用一个变量尝试了一个普通的incrementor,得到了相同的结果,这就是为什么我尝试了一个原子incrementor

    1 回复  |  直到 7 年前
        1
  •  2
  •   Adrian    7 年前

    addCount 接受值接收器,而不是指针,因此它在结构的副本上操作,递增副本的字段,然后丢弃副本。改为使用指针:

    func (p *PipelineData) addCount(){
    

    这应该能解决你的问题。