go 返回值是否需要尽量返回值,而不返回指针呢?

2023-12-27 23:25:54 +08:00
 dyllen

理由如下:

根据内存逃逸的规则,把函数局部变量的指针返回会逃逸,结果导致 gc 压力变大。

所以是否需要尽量返回值,而不返回指针呢?

比如查询一个数据模型返回它,还有其他许多情况。

3489 次点击
所在节点    Go 编程语言
30 条回复
dyllen
364 天前
@dyllen 有些又是直接返回结果 model 的指针。
keakon
364 天前
@chenchengbin 字符串是浅拷贝 StringHeader
thinkershare
364 天前
@chenchengbin 当然不会,golang 的字符串本质上就不是一个纯值类型。
Maboroshii
364 天前
orm 一般用到反射,反射会引起逃逸,所以直接用指针了
@dyllen
Maboroshii
364 天前
orm 用参数当返回值的另一个点,就是需要调用方来控制这段内存的申请和销毁(在 go 里,你可以用 sync.Pool 来优化)。 也是 C/C++里面的原则吧,谁声明,谁处理, 调用方 malloc 了 ,调用方来 free ,方法内部是不会帮你初始化堆上的内存的。
chenchengbin
364 天前
@Maboroshii 都在 orm 上了各种反射
flmn
364 天前
尽量用值吧,编译器会帮你优化的
ZSeptember
364 天前
尽量用值,除非你的业务量真的到需要用这种细节来优化了,不过真的到时候也是应该先 bench 一下。
我们的业务代码基本不用指针,入参,出参都不用,推荐方法无状态,副作用可控,容易测试。
szzhiyang
364 天前
@chenchengbin 字符串(数组)的内部实现: https://go.dev/blog/slices
chenchengbin
364 天前
@szzhiyang 擦,一直以为 go 的 string 是复制一个字符串,我知道内部实现是这玩意, 但是也没深入看过, 学习了学习了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX