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) } }详细解析
时间: 2024-04-15 19:27:37 浏览: 165
【Go】go语言中的几点细节
这段代码创建了一个切片 `slice` 和一个映射 `m`。然后,通过遍历 `slice`,将每个值的地址存储到映射 `m` 中。最后,使用 `range` 循环遍历映射 `m`,打印每个键值对。
然而,这段代码存在一个陷阱。由于在循环中创建了一个名为 `value` 的临时变量,并将其地址存储到映射 `m` 中,而这个临时变量在每次循环迭代时都会被重新分配。因此,在循环结束后,映射 `m` 中的所有值都指向了同一个地址,即最后一次迭代的临时变量 `value` 的地址。
因此,当打印映射 `m` 时,所有的键值对都会打印出相同的值,即最后一个元素的值。
要解决这个问题,可以在循环中使用一个局部变量来存储临时值的副本,并将副本的地址存储到映射中。这样,每个键值对都有自己的地址和值。修改后的代码如下:
```go
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)
}
}
```
这样修改后,输出结果将会是:
```
0 ===> 0
1 ===> 1
2 ===> 2
3 ===> 3
```
每个键值对都正确地打印了相应的值。
阅读全文