for-range又来啦~

下面这段代码输出结果正确吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type Foo struct {
bar string
}
func main() {
s1 := []Foo{
{"A"},
{"B"},
{"C"},
}
s2 := make([]*Foo, len(s1))
for i, value := range s1 {
s2[i] = &value
}
fmt.Println(s1[0], s1[1], s1[2])
fmt.Println(s2[0], s2[1], s2[2])
}
1
2
3
输出:
{A} {B} {C}
&{A} &{B} &{C}

答案:

​ s2输出的结果是&{C}&{C}&{C},故上述的输出是错误的。

​ 在前面的题目,我们提到过,for-range使用短变量声明(:=)的形式迭代变量时,变量i、value每次在循环题中都会被重用,而不是重新声明。故s2每次填充的都说value的地址,而在组后一次循环中,value被赋值为{C}。因此s2输出显示三个&{C}。

解决办法:

1
2
3
for i := range s1 {
s2[i] = &s1[i]
}

for-range又来啦~
http://example.com/2023/04/22/Go每日一题/for-range又来了/
作者
Feng Tao
发布于
2023年4月22日
更新于
2023年4月22日
许可协议