自己写的 go 代码就是由一堆的 if 搭起来的

2020-11-03 17:21:45 +08:00
 bandian

代码里面在疯狂的 if 判断,其中 if err !=nil 最多,感觉一个函数三分之二都在写判断逻辑,这就是入门开发者吗

7521 次点击
所在节点    程序员
38 条回复
togou
2020-11-03 17:40:36 +08:00
主要有的东西感觉根本不会 err 的你就把他 _ 掉算了
THESDZ
2020-11-03 17:42:26 +08:00
是不是过度封装了?
导致需要判断返回的地方太多了?
lepig
2020-11-03 17:46:59 +08:00
贴段代码看看
sunorg
2020-11-03 17:56:23 +08:00
业务逻辑不就是这样??
SuperMild
2020-11-03 18:05:58 +08:00
if err !=nil 太多是 Go 的缺点,你可以看看剔除这个之后,if 还多不多。
SuperMild
2020-11-03 18:06:39 +08:00
更正:不是缺点,是特点。
chenqh
2020-11-03 18:07:16 +08:00
有个问题,golang 加个默认值有那么困难吗?
wysnylc
2020-11-03 18:23:29 +08:00
@SuperMild #6 是特色,是进步!
lewis89
2020-11-03 18:25:53 +08:00
如何看待百度无人车有 3 万个 if
DeWhite
2020-11-03 18:25:56 +08:00
if err 我个人觉得是一个好东西,我可以通过返回值 找到写报错的地方。
jin7
2020-11-03 18:39:29 +08:00
换语言 逃....
jinliming2
2020-11-03 21:48:28 +08:00
我觉得:Go 里的 if err != nil 判断是否出错,表明这里确实有可能出错,那么不论是什么编程语言,都是有可能出错的。
比如写个除法函数,返回商和余数,但如果除数参数提供了 0,那么结果就是应该出错(不考虑返回无穷之类的情况)。
在其他语言里,这叫“异常”,他们几乎都有 try-catch 语法,来捕获错误,比如:
```
try {
可能出错的函数 A();
可能出错的函数 B();
可能出错的函数 C();
} catch (错误 A) {
} catch (错误 B) {
} catch (错误 C) {
} finally {
}
```
在 Go 里面,实际上也有类似的写法:
```
defer func () {
if err := recover(); err != nil {
// 判读 err 的类型,处理不同错误
}
// finally
}()
可能出错的函数 A()
可能出错的函数 B()
可能出错的函数 C()
```
这样写是不是就有点类似了?
但是不管是 try-catch 还是 panic-recover,他们的问题都是:抛出错误,在某个位置集中捕获。这样在代码层面你就不知道错误具体是在哪里抛出来的了,只能在运行时打堆栈,相同类型的错误也就只能是统一的处理方法。

而 Go 语言的一般风格是:错误在哪里抛出,就在哪里处理掉,这样对错误的处理会比较明确。

比如在一个函数里有两个除法运算,除数都有可能为 0 。那么 try-catch 就只能在捕获到错误时打一个除数为 0 的日志,而 Go 的风格则可以报第一步除数为 0 或是第二步除数为 0 。

当然,try-catch 也可以写成 一行语句一个捕获的形式,那样的话比 if err != nil 更恐怖,而且还有变量块级作用域的问题。
Mohanson
2020-11-03 21:58:43 +08:00
只要胆子大, 贞子放产假

https://github.com/mohanson/doa

刚写的库, 就等 go1.17 上泛型可以带返回值类型了...
Mohanson
2020-11-03 22:01:47 +08:00
不过事实上我已经用 go2go 分支编译过, 换成泛型写法爽歪歪~

现在自己写的几个库都在等泛型重写, 没泛型可真的要命
leavic
2020-11-03 22:03:36 +08:00
if err 我觉得根本是 golang 自己的坑
Mac
2020-11-03 22:10:17 +08:00
不是还有人用一堆 if 做游戏的嘛
loolac
2020-11-03 23:17:28 +08:00
@jinliming2 追溯错误来源一般都堆栈轨迹的吧,try-catch 可以根据错误处理继续后面的逻辑,比如错误可以导致返回结果的变更,但是 panic-recover 就很难做到了,golang 函数调用基本上都是传值,defer 函数中要改变返回内容,必须使用指针,而且封装逻辑也必须使用闭包函数,出错前后的代码逻辑和可复用部分的代码必须使用闭包函数封装,写出来的代码很“反”。
hallDrawnel
2020-11-03 23:27:36 +08:00
如果函数会出错,本来就应该处理错误呀。我觉得 if err != nil 虽然繁琐,但是从语法上强迫人处理错误是一件好事情。
phithon
2020-11-03 23:59:47 +08:00
学几个设计模式,多用些接口,可能会好点
xyxy
2020-11-04 00:38:40 +08:00
诶 是因为新手,我新写 golang 也是这样的

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

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

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

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

© 2021 V2EX