来看下今天的题目:
下面这段代码输出什么,说明原因。
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)
}
}
扩展题目
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()
}
}
有疑问加站长微信联系(非本文作者)

正确写法中循环赋值部分感觉如果这么写会好一点
嗯 你的是优化写法,👍
ps:
原题摘自:Golang语言面试题(精编263道题),包含解析!!!
c b a defer的出栈方式
你运行下代码试试看,会有惊喜。
欢迎大家来交流这道题!
扩展题目有知道正确答案的同学吗?
给struct绑定方法时,尽量不要用
this
me
self
等这些名词呀是的,一般推荐使用结构体名称的简写,比如这里可以使用 t。
原题摘自:Golang语言面试题(精编263道题),包含解析!!!
又是新的一天,加油!💪
两道题一样的现象 ccc
是的。
作用域