最近发布的主题
最近发布的文章
暂无
最近分享的资源
暂无
最近发布的项目
暂无
最近的评论
-
评论了面试题 Go每日一题(1)0 -> 3 1 -> 3 2 -> 3 3 -> 3 原因分析 在该程序中,存在对 range 和指针引用的理解误区。下面逐步解释为什么会出现这种结果: 1. slice 的遍历 ```go slice := []int{0, 1, 2, 3} 这是一个包含4个元素的切片:[0, 1, 2, 3]。 ``` 2. 遍历时将值的地址存入 map ```c for key, val := range slice { m[key] = &val } ``` 在这个循环中,val 是每次迭代时从 slice 中复制的一个副本。 &val 取的是变量 val 的地址。然而,由于 val 是一个局部变量,在整个循环过程中,它的地址始终是相同的(因为 Go 的 range 会复用同一个变量)。 所以,m[key] = &val 存储的是同一个地址,即指向最终的值 3(最后一次迭代的值)。 3. 最终输出结果 ```c for k, v := range m { fmt.Println(k, "->", *v) } ``` 因为所有的指针都指向了 val 的最终值 3,所以无论访问哪个键的值,都会显示 3。 解决方法 如果希望每个指针对应正确的值,可以修改代码如下: ```c for key, val := range slice { temp := val m[key] = &temp } ``` 这样,每次循环都会创建一个新的变量 temp,其地址不同且保存当前的 val 值,从而避免了所有指针指向同一个值的问题。 总结 问题本质:所有指针指向同一个变量 val 的地址。 解决方式:通过引入临时变量确保每个指针指向独立的值。 ```
-
评论了面试题 Go每日一题(89)
-
评论了面试题 Go每日一题(84)
-
评论了博文 国内ChatGPT中文版,GPT4无限使用无法访问 
-
评论了面试题 Go每日一题(79)