簡體   English   中英

GoLang追加到嵌套切片

[英]GoLang append to nested slice

在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}]}]}}

您的問題是這樣的:

for _ , queue := range T.Queues {

將值從T.Queues復制到queue ,然后使用該副本的地址:

cur_queue = &queue

並最終修改副本,同時僅將T.Queues片中的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很大,則可能要切換到地圖,以便沒有太多的線性搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM