登录
首页 >  Golang >  Go教程

Go 面试难题:为什么 for range 循环中 map 的所有 v.name 都变成了“博客”?

时间:2024-11-13 16:34:15 351浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《Go 面试难题:为什么 for range 循环中 map 的所有 v.name 都变成了“博客”?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

Go 面试难题:为什么 for range 循环中 map 的所有 v.name 都变成了“博客”?

Go面试难题:为何键值对中v.name都是“博客”

题目中展示了一个简单的Go程序,其中有一个map[string]*student类型的数据结构m。当程序执行for range循环时,注意到键值对中v.name的值都变成了“博客”。那么,为什么会出现这种情况呢?

答案:变量地址固定

问题关键在于for range循环的变量地址是固定的。在for range循环中,k和v分别是map键和值的地址。当循环执行时,它会将map中每个键值对的地址依次赋值给k和v。

然而,在问题代码中,使用的是指针类型(*student)。这意味着,&stu变量指向student结构体的地址,而不是结构体本身。因此,所有指向student结构体的指针都有相同的地址。

指针赋值

在for range循环的每一次迭代中,m[stu.name] = &stu本质上是将相同地址(student结构体的地址)分别赋值给map的每个key。如此一来,当最后迭代结束后,map中的所有value都指向student结构体的同一地址。

结果:统一的值

由于所有value都指向同一地址,这意味着当对这些值进行更改时,它们的底层对象(student结构体)也会被更改。因此,程序最后打印的结果中, सभी v.name 的值都变成了循环中最后赋值的值“博客”。

通过了解指针和变量地址的原理,可以理解为什么在给定代码中会发生这种现象。这有助于在编写Go程序时避免潜在的陷阱和错误。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>