for-loop - 为什么正常的 for 循环允许为结构字段分配值,而 for range 在 Golang 中不起作用?

标签 for-loop go range for-range

这个问题在这里已经有了答案:





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/

相关文章:

algorithm - 嵌套循环的运行时间(大O)

PHP FetchAll() 不返回行

string - 使用 awk 循环输入字符串中的字符

python - 等效于 Python 的列表推导

go - 当方法实际上没有丢失时接口(interface)转换 panic

海图 : labels inside columnrange bar

c# - 实现自定义 Int+Range 列表解决方案

c++ - 具有两个不同变量类型的循环初始化

go - MIME 类型 (“text/plain” )不匹配(X-Content-Type-Options : nosniff)

android - 如何在Android中获取一系列字符串?