golang 函数返回值 2 个写法,哪个更好?

2021-07-12 18:05:07 +08:00
 wangbenjun5
自己平时写项目,喜欢把返回值 return 回去,比如

所以一般函数都是 function_name()([]struct, error)这种形式。

但是我经常也看到很多人喜欢另一种写法,就是把返回值作为参数传进去,最后只 return error,像这样 function_name(result *[]struct) error

结果都是一样,但是过程不一样,我的那种方式需要在函数里面创建一个 slice,把结果塞进去 return 。但是传参数这种方式,可以直接拿来用,所以理论上第二种方式更高效吗?

大家喜欢哪种写法?
3571 次点击
所在节点    Go 编程语言
31 条回复
keepeye
2021-07-12 18:07:21 +08:00
大多第一种,第二种像是写 c
wangbenjun5
2021-07-12 18:07:29 +08:00
这种把返回值定义好传到目标函数里面获取结果的写法很常见,貌似写 c 语言的比较喜欢这种写法吧?
darksword21
2021-07-12 18:07:30 +08:00
第一种,改别人代码时被第二种坑过
darksword21
2021-07-12 18:08:18 +08:00
看错了抱歉,无视上面⬆️
morty0
2021-07-12 18:15:05 +08:00
第二种哪里高效了,slice 不也要在外面创建吗
wangbenjun5
2021-07-12 18:16:12 +08:00
@morty0 但是可能那个 slice 在外面本来就需要创建,所以
wangbenjun5
2021-07-12 18:16:46 +08:00
@keepeye 是的,有这个感觉,我还见过有写 Python 的也是这种写法
colors
2021-07-12 18:22:33 +08:00
第二种不可取,很容易出问题,而且没有更高效
generic
2021-07-12 18:23:16 +08:00
GC 语言里创建 slice 开销较低,如非必要都用第一种。
wangbenjun5
2021-07-12 18:26:12 +08:00
@generic 不一定是 slice,也可能是对象等其它指针类型
mainjzb
2021-07-12 18:26:22 +08:00
go 选第一种
C/C++ 选第二种为了控制生命周期,而且他们只能返回一个值,那必然只能返回 err
{
auto X = NewResult();
GetResult(X);
DoSomething(X);
//Delete(X);
}
C++讲究谁创建,谁释放, 你创建,我忘了释放,那就傻逼了。GetResult 完全可是是 RPC 或者底层库,或者其他不是我写的代码。
wangbenjun5
2021-07-12 18:28:42 +08:00
@mainjzb 突然想起来了,很多语言函数只能返回一个值,哈哈,原来如此
chotow
2021-07-12 18:43:32 +08:00
看标题还以为比较的是 function_name()([]struct, error) 和 function_name()(ret[]struct, err error) 这两种写法 😑
XCFOX
2021-07-12 18:50:43 +08:00
pkoukk
2021-07-12 18:54:45 +08:00
个人一般只有涉及反序列化才会用第二种,类似 json.Unmarshal()这种行为的时候才会通过指针替换原来对象里的值
wangbenjun5
2021-07-12 19:06:15 +08:00
@chotow 你说的第二种也操蛋,我极少用
zoharSoul
2021-07-12 19:30:56 +08:00
函数最好不要有副作用,
后面看代码很累. 一个对象进去一次就变了跟魔法一样
generic
2021-07-12 19:47:04 +08:00
@wangbenjun5 我觉得也一样,除非你预期用户几乎总是会重用一个对象作为输出,或者这就是优化的关键点,否则不值得操这个心。
bringyou
2021-07-12 20:01:37 +08:00
补充一条,因为 go 没有泛型,在一些场合下,第一种调用方还需要来一次类型强转,第二种不用
ylsc633
2021-07-12 20:26:53 +08:00
引用类型的 是可以这么用

但是不建议这样用, 因为你不知道在什么地方改了它, 然后在另外一个地方用了它

所以我一般都是第一种

另外,多个返回值真的非常好用

还有结构体 可以在一个文件里 定义多个实在是太爽了

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

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

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

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

© 2021 V2EX