大家好。
我在本站搜索了下,没有搜到相关内容,所以开贴问一下。
以前都是返回的指针:
func getItem(itemId int) *model.Item {
i := model.item{}
i.Name = "abc"
return &i
}
这样会逃逸到堆上
如果上面的方法,直接返回:model.Item
,是会发生栈拷贝吧?
请问哪种方式比较好?
有疑问加站长微信联系(非本文作者)

大家好。
我在本站搜索了下,没有搜到相关内容,所以开贴问一下。
以前都是返回的指针:
func getItem(itemId int) *model.Item {
i := model.item{}
i.Name = "abc"
return &i
}
这样会逃逸到堆上
如果上面的方法,直接返回:model.Item
,是会发生栈拷贝吧?
请问哪种方式比较好?
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
凡是struct我都返回指针。
连map和slice很多时候我都会返回指针(用type自定义一个类型,比如type xxxx *[]string)。
优点是以后如果重构,基本不会调整调用方的代码。
都用自动GC的语言了,不要过多考虑细节。
细节等具体业务跑起来根据实际情况再优化。
建议指针。 至少代码层面判断空值好判断
建议优先返回值。
为什么你会有这些担心呢? 完全不理解
你是把其他语言的问题带到go语言里了吧
建议基于你的需求做考虑: 1.认为它有必要常驻内存,或者在一段时间内(例如某个用户的特性)常驻 则考虑用指针 2.其他情况建议用值返回
ps:不要什么都依赖gc,在golang编程中,更多的考虑怎么减少gc
建议用指针。因为如果函数返回会执行栈上拷贝,在栈上去创建了一个新的对象。旧的对象就交给了gc了。这样从性能角度考虑,如果返回指针,只不过对象从栈上逃逸到了堆上了。没有去创建新的对象。也不许gc去处理旧的对象。
谢谢大家的回复。 我还是从它的生命周期考虑,像 mlzhou 说的,如果比较常驻,就指针
注意,我只告诉你一个,你可别跟人说,就像一些老前辈说的,没有BUG也要制造一点点BUG,不然等到项目完成了,你也就成了闲人一个,随时让你走人!
如果是一个大对象建议返回指针, 如果不是那么还是直接返回. 如果是常驻全局变量, 那肯定是指针了毫无疑问, 因为压根就不会释放.
还是10楼说的有道理。不要什么都用指针,只有大结构体,全局变量适合用指针。普通对象指针用多了会发生内存逃逸,导致gc压力过大。 go官方一些规范里面,也是推荐一般情况下传值。
指针和常驻有什么关系…………
比如标准库的http包
request,cookie明显不是常驻的,实际使用的时候都是指针。
本质上来说,指针和[]byte都是有特殊含义的。
指正指在内存中的一片抽象的数据,[]byte指抽象的内存空间。
返回一个具体的struct本身的花,说明你除了抽象的数据之外有别的逻辑上的目的在里面。
所以只有明确你的特殊目的才会直接返struct。
这是一个逻辑问题……
至于我说的
“自动GC的语言了,不要过多考虑细节”
你都用runtime的自动gc了,所有的细节其实是依赖于你的runtime而不是你自己的代码了。
你考虑细节很可能随着版本的升级与你的目的背道而驰了。