问题 7.5 假设我们有如下数组:items := [...]int{10, 20, 30, 40, 50}
a) 如果我们写了如下的 for 循环,那么执行完 for 循环后的 items 的值是多少?如果你不确定的话可以测试一下:)
for _, item := range items {
item *= 2
}
b) 如果 a) 无法正常工作,写一个 for 循环让值可以 double 。
如何实现:一个 for 循环让值可以 double ?
1
zjj19950716 2022-04-19 09:41:28 +08:00
for i := range items {
items[i] *= 2 } |
2
seers 2022-04-19 09:51:09 +08:00 via Android
左边的 item 是新建的变量
|
3
RheatiN 2022-04-19 09:52:02 +08:00
这个应该是很常见的问题吧,foreach 是只读的
|
4
tianyou666shen 2022-04-19 09:52:55 +08:00
楼上这个可以
items : [10 20 30 40 50] 运行后变成 items : [20 40 60 80 100] |
5
tianyou666shen 2022-04-19 10:19:57 +08:00
尝试打印每个循环中的变量地址
代码: items := [...]int{10, 20, 30, 40, 50} for k, item := range items { fmt.Println("k: ", k, "&items[k] :", &items[k], "&item: ", &item) } 结果: k: 0 &items[k] : 0xc000015650 &item: 0xc00014ecb8 k: 1 &items[k] : 0xc000015658 &item: 0xc00014ecb8 k: 2 &items[k] : 0xc000015660 &item: 0xc00014ecb8 k: 3 &items[k] : 0xc000015668 &item: 0xc00014ecb8 k: 4 &items[k] : 0xc000015670 &item: 0xc00014ecb8 可以看到每个循环的过程中,item 这个变量的地址是相同的,并没有依次指向数组的每个元素. 所以对他进行的操作,都是修改的这个循环内存的变量,不会对原数组造成影响. 要操作数组每个元素,用索引的方式 items[k] 更多信息: https://go.dev/ref/spec#For_statements |
6
sardina 2022-04-19 10:49:23 +08:00
for 出来的值是复制了一下
|
7
bequt 2022-04-19 11:01:58 +08:00
用一楼方法就可以了
|