Go golang 函数返回结构体或者结构体指针

neuman · 2022年01月22日 · 最后由 HDJ 回复于 2022年02月04日 · 1133 次阅读

请教一下 golang 函数返回结构体或者结构体指针到底有什么区别?

去 go 论坛提问应该更好? 返回结构体应该是 copy。 指针的话应该不需要 copy。 现在很多库都喜欢 zero copy。

其他没指针的语言,比如 python 返回的是 copy 吗?

akai76 回复

python 我知道,比如 python 返回一个列表,代表着返回了列表的指针

这个我最近正好研究了一下,这个和内存逃逸有关系。

首先明确一点:在函数内创建的变量在栈上。

  1. 如果函数返回一个结构体,那么就会拷贝一份该结构体,然后把函数内的结构体销毁掉。
  2. 如果返回的是指针或者 interface{} 类型,那么指针指向的地址所存放的变量就不可以再储存在栈上了,Go 就会帮助他逃逸到堆上。

两种方法比较之下,可以得到结论:

  1. 如果你的对象很大,拷贝对象需要花费太多资源,那么就可以选择返回指针。
  2. 如果对象不大,那么返回结构体是一个比较好的选择,因为一旦内存逃逸到堆上,就会增大 GC 的压力。

返回指针可以继续用 new 后存储的数据和结构体的方法,更改后旧的数据同步更改。 返回结构体就是不想再和旧的有关,需要独立出来使用就这样才好

返回结构会 copy,内存会分配在栈里,父级函数结束会直接释放内存 返回结构指针,内存会分配在堆里,由 GC 自动释放。

但是也有一些情况会导致返回结构分配在堆里,比如对象太大和对外引用

需要 登录 后方可回复, 如果你还没有账号请 注册新账号