1. 首页
  2. 主题
  3. Go面试题

Golang 语言面试题 - 第 2 天 (一起来看下评论区热闹的讨论!!!)

Seek · · 3354 次点击
来看下今天的题目: 下面这段代码输出什么,说明原因。 ```go 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) } } ``` 参考答案: ```go 0 -> 3 1 -> 3 2 -> 3 3 -> 3 ``` 解析:这是新手常会犯的错误写法,for range 循环的时候会**创建每个元素的副本,而不是元素的引用**,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3. 正确的写法: ```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) } } ``` 扩展题目 ```go 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() } } ``` <br> 参考: https://blog.csdn.net/idwtwt/article/details/87378419
Seek
公众号「Golang来啦」,wx:seekload01,个人主页 seekload.net
你运行下代码试试看,会有惊喜。
#4
更多评论
正确写法中循环赋值部分感觉如果这么写会好一点 ``` go for key := range slice { m[key] = &amp;slice[key] } ```
#1
Seek
公众号「Golang来啦」,wx:seekload01,个人主页 seekload.net
嗯 你的是优化写法,👍 ps: 原题摘自:[Golang语言面试题(精编263道题),包含解析!!!](https://seekload.net/2021/02/28/interview-question.html)
#2

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中