这个问题在这里已经有了答案:
Change values while iterating
(4 个回答)
Why can't I change the values in a range of type structure?
(2 个回答)
2年前关闭。
用于范围:
for _, acc := range accounts{
accDetails, _ := repo.GetAccountDets(ctx, acc.number, acc.status)
acc.Details = *accDetails
}
上面那个不行。
但是,以下工作。
for i:=0; i < len(accounts); i++ {
accDetails, _ := repo.GetAccountDets(ctx, accounts[i].number, accounts[i].status)
accounts[i].Details = *accDetails
}
这是为什么?
我认为在此处添加帐户结构详细信息没有任何值(value)
最佳答案
在 for i,v:=range slice {...}
形式的 for 循环中, 变量 v
与它循环的元素具有相同的类型,并且每次迭代都将下一项的内容从 slice/映射复制到 v
.所以如果 v
是一个结构,并且您将值分配给结构成员,这些成员永远不会复制回它从中复制的 slice 中。
如果 slice 是指向结构的指针 slice ,则 v
是指向结构的指针的副本,以及您对 v
所做的更改的成员将反射(reflect)在原始 slice 元素上。
解决此问题的一种方法是使用索引:
for i:=range accounts {
accounts[i].Field=value
}
关于for-loop - 为什么正常的 for 循环允许为结构字段分配值,而 for range 在 Golang 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61605727/