the-way-to-go 7.5 小节里的问题

2022-04-19 09:38:50 +08:00
 xoxo419

问题 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 ?

1442 次点击
所在节点    Go 编程语言
7 条回复
zjj19950716
2022-04-19 09:41:28 +08:00
for i := range items {
items[i] *= 2
}
seers
2022-04-19 09:51:09 +08:00
左边的 item 是新建的变量
RheatiN
2022-04-19 09:52:02 +08:00
这个应该是很常见的问题吧,foreach 是只读的
tianyou666shen
2022-04-19 09:52:55 +08:00
楼上这个可以

items : [10 20 30 40 50]
运行后变成
items : [20 40 60 80 100]
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
sardina
2022-04-19 10:49:23 +08:00
for 出来的值是复制了一下
bequt
2022-04-19 11:01:58 +08:00
用一楼方法就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX