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

来源:2-7 指针

wdmzjgxd

2019-07-24

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

写回答

1回答

ccmouse

2019-07-28

你最后的理解是正确的。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
2
ccmouse
回复
wdmzjgxd
太好了,这也是我希望大家得到的
2019-07-28
共2条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1908 问题

查看课程