【问题标题】:GoLang append to nested sliceGoLang 附加到嵌套切片
【发布时间】:2019-01-02 21:10:30
【问题描述】:

在 GoLang 中,具有以下结构和方法,我试图附加到属于嵌套在另一个结构中的结构的切片:

/* Tiers agent struct */
type Agent struct {
    Registration string
}

/* Tiers queue struct */
type Queue struct {
    Name string
    Agents []Agent
}

/* Tiers struct */
type Tiers struct {
    Queues []Queue
}

func (Q *Queue) AddAgent (agent_registration string) {

    Q.Agents = append(Q.Agents, Agent{Registration: agent_registration})
}

func (T *Tiers) AddQueue(queue_name string, agent_registration string) {

    var cur_queue *Queue

    found_queue := false

    /* Find queue by queue name */
    for _ , queue := range T.Queues {
        if queue.Name == queue_name {
            found_queue = true
            cur_queue = &queue
        }
    }

    /* If queue not found, create a new one */
    if found_queue == false {
        T.Queues = append(T.Queues, Queue{Name: queue_name})
        cur_queue = &(T.Queues[len(T.Queues)-1])
    }

    /* Add agent to queue (add tier) */
    cur_queue.AddAgent(agent_registration)
}

我的业务规则是我会收到很多 {queue_name, agent_name} 对,我想构建一个结构,将共享相同“queue_name”的所有代理分组。所以,最终我想要这样的东西:

队列 1:['agent1', 'agent2', 'agent3', ...] 队列2:['agent4', 'agent5', ...]

我正在使用上面提到的结构对此进行建模。问题是当我尝试将代理添加到队列时,只有最后一次插入仍然存在。示例:

tiers.AddQueue('suport@default', '1000@default')
tiers.AddQueue('suport@default', '1003@default')
tiers.AddQueue('suport@default', '1001@default')

输出:{[{support@default [{1001@default}]}]}

当我想要的是输出是:

输出:{[{support@default [{1000@default},{1003@default}, {1001@default}]}]}

【问题讨论】:

标签: go struct slice


【解决方案1】:

你的问题是这样的:

for _ , queue := range T.Queues {

将值从T.Queues 复制到queue,然后获取该副本的地址:

cur_queue = &queue

最终修改副本,同时将 Queue 单独留在 T.Queues 切片中。

一个简单的解决方案是使用循环的for i := range ... 形式并在切片而不是副本中获取Queue 的地址:

for i := range T.Queues {
    if T.Queues[i].Name == queue_name {
        found_queue = true
        cur_queue = &T.Queues[i]
    }
}

你也可以使用一片指针然后回到你的

for _ , queue := range T.Queues {

循环,queue 已经是一个指针。

一旦你发现了一些东西,你可能想早点break 退出循环。如果T.Queues 预计很大,您可能需要切换到地图,这样您就不会进行太多线性搜索。

【讨论】:

  • 我可以假设“查看”地图中的键在计算复杂度方面是 O(1) 吗?
  • @Pavarine spec 不能保证这一点,但您应该安全地假设它是一个合理的实现(即摊销 O(1))。
  • 感谢您的见解,非常清晰,我选择了 structs 解决方案,因为我认为它会更具性能,即使使用线性搜索(我来自天真的 C 背景),但现在我打算使用地图解决方案,因为它看起来更有效。谢谢
猜你喜欢
  • 2016-05-25
  • 2013-12-10
  • 2016-12-24
  • 2014-03-25
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2020-12-09
  • 2021-09-21
相关资源
最近更新 更多