Go 面试题2
1: 下面这段代码输出什么, 说明原因:
package main
import "fmt"
func main() {
slice := []int{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: 答案以及解析:
$ go run demo1.go
0 --> 3
1 --> 3
2 --> 3
参考解析: 这是新手常会犯的错误写法, for range
循环的时候会创建每个元素的副本,而不是元素的引用,
所以m[key] = &val
取的都是变量val
的地址,所以最后map
中的所有元素的值都是变量val
的地址,
因为最后val
被赋值为3, 所有输出都是3.
正确写法:
package main
import "fmt"
func main() {
slice := []int{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)
}
}
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付