1.下面代码的输出是什么,说明原因。
import "fmt"
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)
}
}
知识点:for range循环的时候会创建每个元素的副本,而不是元素的引用,所以m[key] = &val取的都是变量val的地址,所以最后map中的所有元素的值都是变量val的地址,因为val最后被赋值为3,所以输出都是3,这里可能有的读者不太懂,是这样的,经过一个for循环m的所有键对应的值都等于val地址保存的值,val在开始循环的时候被定义,因此地址是不变的,每循环一圈,他会被重新赋值,slice的最后一项等于3,因此最后val地址所保存的值就是3,所以运行后*v的值都是3。
输出:
$ go run main.go
0 -> 3
1 -> 3
2 -> 3
3 -> 3
1431

被折叠的 条评论
为什么被折叠?



