[英]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.