【问题标题】:Trying to add only unique elements to array [closed]尝试仅向数组添加唯一元素[关闭]
【发布时间】:2020-09-15 06:58:29
【问题描述】:

我正在尝试跟踪数组中的所有“工人”。 m 是一个具有字符串字段 uuid 的结构,args 也是如此。我不确定这里出了什么问题,但是代码会一次又一次地添加具有相同 uuid 的工作人员(在调用代码时)。

任何帮助将不胜感激。

P.S:这段代码可能会被同时调用(但代码是互斥锁的,所以没关系)

    var pollingWrkr *Wrkr
    pollingWrkr = nil
    for idx, w := range m.workers {
        if w.uuid == args.WorkerUUID {
            pollingWrkr = &m.workers[idx]
            break
        }
    }

    // add new worker
    if pollingWrkr == nil {
        pollingWrkr = new(Wrkr)
        m.workers = append(m.workers, *pollingWrkr) // add worker to list
        log.Printf("worker %v added\n", args.WorkerUUID)
    }

【问题讨论】:

  • 提供的代码从不将 uuid 分配给工作人员,所以他们都没有 uuid,或者他们没有?
  • 请注意,由于您将非指针存储在切片中,因此您需要在第二个循环中分配 uuid,在追加之前分配给 pollingWrkr.uuid,或者在追加之后分配给 m.workers[len(m.workers)-1].uuid。跨度>
  • 是的,解决了!非常感谢;不敢相信我错过了!

标签: arrays pointers go concurrency mutex


【解决方案1】:

正如@mkropriva 指出的那样,从未分配过新的 Wrkr 的 uuid。

if pollingWrkr == nil {
        pollingWrkr = new(Wrkr)
        pollingWrkr.uuid = args.WorkerUUID // THIS HERE SOLVED IT!!!
        m.workers = append(m.workers, *pollingWrkr) // add worker to list
        log.Printf("worker %v added\n", args.WorkerUUID)
    }

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多