Go面试题2

Posted by     "" on Wednesday, December 11, 2019

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)
    }
}

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付