for-range遍历

题目:

下面这段代码输出什么,说明原因。

1
2
3
4
5
6
7
8
9
10
11
12
func main() {
slice := []int{0,1,2,3}
m := make(map[int]*int)

for key,val := range slice {
m[key] = &val
}

for k,v := range m {
fmt.Println(k,"->",*v)
}
}

答案解析:

1
2
3
4
0 -> 3
1 -> 3
2 -> 3
3 -> 3

解析:这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3.

正确的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {

slice := []int{0,1,2,3}
m := make(map[int]*int)

for key,val := range slice {
value := val
m[key] = &value
}

for k,v := range m {
fmt.Println(k,"===>",*v)
}
}

扩展题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type Test struct {
name string
}

func (this *Test) Point(){
fmt.Println(this.name)
}

func main() {

ts := []Test{
{"a"},
{"b"},
{"c"},
}

for _,t := range ts {
//fmt.Println(reflect.TypeOf(t))
defer t.Point()
}

}

参考:https://blog.csdn.net/idwtwt/article/details/87378419


for-range遍历
http://example.com/2023/08/19/Go每日一题/for-range遍历/
作者
Feng Tao
发布于
2023年8月19日
更新于
2023年8月19日
许可协议