Go 方法返回的 struct,是指针还是直接返回比较好?

songday · 2020-05-08 09:15:12 · 5954 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-05-08 09:15:12 的主题,其中的信息可能已经有所发展或是发生改变。

大家好。

我在本站搜索了下,没有搜到相关内容,所以开贴问一下。

以前都是返回的指针:

func getItem(itemId int) *model.Item {
  i := model.item{}
  i.Name = "abc"
  return &i
}

这样会逃逸到堆上

如果上面的方法,直接返回:model.Item,是会发生栈拷贝吧?

请问哪种方式比较好?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5954 次点击  ∙  1 赞  
加入收藏 微博
12 回复  |  直到 2020-06-04 11:05:02
jarlyyn
jarlyyn · #1 · 5年之前

凡是struct我都返回指针。

连map和slice很多时候我都会返回指针(用type自定义一个类型,比如type xxxx *[]string)。

优点是以后如果重构,基本不会调整调用方的代码。

都用自动GC的语言了,不要过多考虑细节。

细节等具体业务跑起来根据实际情况再优化。

a7505553
a7505553 · #2 · 5年之前

建议指针。 至少代码层面判断空值好判断

GalaIO
GalaIO · #3 · 5年之前

建议优先返回值。

zhengkeyu
zhengkeyu · #4 · 5年之前

为什么你会有这些担心呢? 完全不理解

zhengkeyu
zhengkeyu · #5 · 5年之前
zhengkeyuzhengkeyu #4 回复

为什么你会有这些担心呢? 完全不理解

你是把其他语言的问题带到go语言里了吧

mlzhou
mlzhou · #6 · 5年之前

建议基于你的需求做考虑: 1.认为它有必要常驻内存,或者在一段时间内(例如某个用户的特性)常驻 则考虑用指针 2.其他情况建议用值返回

ps:不要什么都依赖gc,在golang编程中,更多的考虑怎么减少gc

yingshuo
yingshuo · #7 · 5年之前

建议用指针。因为如果函数返回会执行栈上拷贝,在栈上去创建了一个新的对象。旧的对象就交给了gc了。这样从性能角度考虑,如果返回指针,只不过对象从栈上逃逸到了堆上了。没有去创建新的对象。也不许gc去处理旧的对象。

songday
songday · #8 · 5年之前

谢谢大家的回复。 我还是从它的生命周期考虑,像 mlzhou 说的,如果比较常驻,就指针

ices
ices · #9 · 5年之前

注意,我只告诉你一个,你可别跟人说,就像一些老前辈说的,没有BUG也要制造一点点BUG,不然等到项目完成了,你也就成了闲人一个,随时让你走人!

focusonline
focusonline · #10 · 5年之前

如果是一个大对象建议返回指针, 如果不是那么还是直接返回. 如果是常驻全局变量, 那肯定是指针了毫无疑问, 因为压根就不会释放.

18393910396
18393910396 · #11 · 5年之前

还是10楼说的有道理。不要什么都用指针,只有大结构体,全局变量适合用指针。普通对象指针用多了会发生内存逃逸,导致gc压力过大。 go官方一些规范里面,也是推荐一般情况下传值。

jarlyyn
jarlyyn · #12 · 5年之前

指针和常驻有什么关系…………

比如标准库的http包

request,cookie明显不是常驻的,实际使用的时候都是指针。

本质上来说,指针和[]byte都是有特殊含义的。

指正指在内存中的一片抽象的数据,[]byte指抽象的内存空间。

返回一个具体的struct本身的花,说明你除了抽象的数据之外有别的逻辑上的目的在里面。

所以只有明确你的特殊目的才会直接返struct。

这是一个逻辑问题……

至于我说的

“自动GC的语言了,不要过多考虑细节”

你都用runtime的自动gc了,所有的细节其实是依赖于你的runtime而不是你自己的代码了。

你考虑细节很可能随着版本的升级与你的目的背道而驰了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传