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

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

理由如下:

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

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

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

3914 次点击
所在节点    Go 编程语言
30 条回复
dyllen
2023-12-28 10:49:51 +08:00
@dyllen 有些又是直接返回结果 model 的指针。
keakon
2023-12-28 10:51:05 +08:00
@chenchengbin 字符串是浅拷贝 StringHeader
thinkershare
2023-12-28 10:51:18 +08:00
@chenchengbin 当然不会,golang 的字符串本质上就不是一个纯值类型。
Maboroshii
2023-12-28 10:52:14 +08:00
orm 一般用到反射,反射会引起逃逸,所以直接用指针了
@dyllen
Maboroshii
2023-12-28 10:58:06 +08:00
orm 用参数当返回值的另一个点,就是需要调用方来控制这段内存的申请和销毁(在 go 里,你可以用 sync.Pool 来优化)。 也是 C/C++里面的原则吧,谁声明,谁处理, 调用方 malloc 了 ,调用方来 free ,方法内部是不会帮你初始化堆上的内存的。
chenchengbin
2023-12-28 10:59:46 +08:00
@Maboroshii 都在 orm 上了各种反射
flmn
2023-12-28 11:32:25 +08:00
尽量用值吧,编译器会帮你优化的
looplj
2023-12-28 11:38:38 +08:00
尽量用值,除非你的业务量真的到需要用这种细节来优化了,不过真的到时候也是应该先 bench 一下。
我们的业务代码基本不用指针,入参,出参都不用,推荐方法无状态,副作用可控,容易测试。
szzhiyang
2023-12-28 12:03:48 +08:00
@chenchengbin 字符串(数组)的内部实现: https://go.dev/blog/slices
chenchengbin
2023-12-28 13:52:01 +08:00
@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