请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

go语言变量内存分配与java对比相关问题

图片描述user变量3次输出的地址一样,有几点疑问:
1、在声明user变量,且还未初始化时,user的内存地址就已经分配好了吗?
2、user变量第二次赋值后,地址还是没变,是不是说明两次创建的实例并没有额外占用空间,而是直接在给user变量分配的内存空间上创建的?
3、根据问题2,对比java中如下图,user地址会变化,因为每次new都会创建新的内存空间,这么对比go语言是不是比java少了一次内存创建和回收呀?
图片描述4、可不可以理解成,go语言中的实例对象是在变量对应的内存中创建的,而java的实例对象在一个新的地址上创建好,然后变量再指向过去的,就是值传递和引用传递的区别

正在回答

1回答

你最后的理解是正确的。java里面只要不是primitive type,那些变量都是引用,jvm会去分配内存,然后再把变量指过去。go语言这里和c/c++比较像。内存的分配发生在var user User那一行。user并不是没有初始化,而且在这一行就初始化完成,其所有字段值都为"零值"。也就是name/pwd均为""后来的操作只是重新赋值。我们新建了临时变量,初始化成aa/123,然后把这个临时变量拷贝到user那块内存去。user的地址永远不会变。我们要在go语言中模拟java的效果应该使用指针。一上来var user *User这里这个user就是nil,没有发生内存分配或是初始化。接下来我们说user=&User{...},这样我们这个user就指向了那个临时变量的地址。接下来user只要还被使用,那个"临时变量"就一直不会被回收。

1 回复 有任何疑惑可以回复我~
  • 提问者 wdmzjgxd #1
    非常老师的解答,学习go语言也让我对以前学过的语言有了更深的理解
    回复 有任何疑惑可以回复我~ 2019-07-28 13:25:43
  • ccmouse 回复 提问者 wdmzjgxd #2
    太好了,这也是我希望大家得到的
    回复 有任何疑惑可以回复我~ 2019-07-28 16:27:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信