GoLang追加到嵌套切片

时间:2018-07-25 23:57:37

标签: go struct slice

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

Owin.Security.Providers

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

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

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

/* 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)
}
  

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

当我想要的输出是:

  
    

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

  

1 个答案:

答案 0 :(得分:3)

您的问题是:

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较大,则可能要切换到地图,以免线性搜索太多。