zoukankan      html  css  js  c++  java
  • Go 面试每天一篇(第 2 天)

    下面这段代码输出什么,说明原因。

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

    参考答案:

    0 -> 3
    1 -> 3
    2 -> 3
    3 -> 3
    

    解析:这是新手常会犯的错误写法,for range 循环的时候会创建每个元素的副本,而不是元素的引用,所以 m[key] = &val 取的都是变量 val 的地址,所以最后 map 中的所有元素的值都是变量 val 的地址,因为最后 val 被赋值为3,所有输出都是3.

    正确的写法:

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

    所有学习上的成功,都只依靠两件事 -- 策略和坚持,而坚持本身就是最重要的策略!

  • 相关阅读:
    真的要努力了
    实事求是
    要努力了
    新征程,新目标
    真的要放弃了吗
    集中力量 主攻文科
    May the force be with me.
    记录级排名
    Android开发过程中git、repo、adb、grep等指令的使用
    Ubuntu环境变量设置
  • 原文地址:https://www.cnblogs.com/heyijing/p/11440134.html
Copyright © 2011-2022 走看看