写了个 err warp,或许可以少写点 if err

2023-04-28 15:43:39 +08:00
 voidmnwzp

一般情况下需要串行化的执行下去,如果其中一步遇到错误就会退出,但这样调用完个每个方法都要写个 err

如果将执行的方法作为一个闭包封装进去,就可以省去一大堆 if err:

这样如果执行的过程中遇到了错误,也会跳过执行, 最后调用 wrap.Error()返回错误 e.g.:

外层变量 a,b,c,d 可以通过闭包来赋值

4090 次点击
所在节点    Go 编程语言
47 条回复
rrfeng
2023-04-28 15:46:28 +08:00
没变少啊……
chanyan
2023-04-28 15:47:23 +08:00
sduoduo233
2023-04-28 15:49:07 +08:00
这样怎么确定 err 是在哪一步抛出的?
learningman
2023-04-28 17:17:14 +08:00
你这写的比 if err 还多
ljsh093
2023-04-28 17:20:35 +08:00
还是 4 行一个啊
777777
2023-04-28 17:24:07 +08:00
就我一个人喜欢写 if err ?简单直接
blackvv666
2023-04-28 17:26:57 +08:00
自己用用可以
hahasong
2023-04-28 17:31:35 +08:00
这还不如用 defer 呢 有种用 java 面向对象打印 hello world 即视感
hzzhzzdogee
2023-04-28 17:41:11 +08:00
其实应该是 wrap?
zhangxh1023
2023-04-28 17:47:30 +08:00
没了 if err 的 golang 都没那味儿了
helloit
2023-04-28 17:49:49 +08:00
errors := map[string]string{
"a": "a error",
"b": "b error",
"c": "c error",
"d": "d error"
}
magicdawn
2023-04-28 17:50:21 +08:00
rust 也是 err value ,但是有 unwrap 和 ?存在方便许多
fgwmlhdkkkw
2023-04-28 17:51:26 +08:00
```

func Must[T any](T val, e error) T {
if e != nil {
painc(e)
}
return val
}


func Must2[T any, K any](T val1, K val2, e error) (T, K) {
if e != nil {
painc(e)
}
return val1, val2
}


```
fgwmlhdkkkw
2023-04-28 17:52:52 +08:00
@fgwmlhdkkkw 😓 哈哈哈哈,,搞混了
cassyfar
2023-04-28 17:54:33 +08:00
人才
cholerae
2023-04-28 17:55:20 +08:00
你重新发明了那篇经典的 errors are values 博文中建议的实践。

https://go.dev/blog/errors-are-values
Leviathann
2023-04-28 18:10:49 +08:00
@magicdawn rust 是 value or error 不是 value and error
TWorldIsNButThis
2023-04-28 18:16:51 +08:00
@cholerae
这篇经典博文也不过是在重新发明 result/either monad
也许这就是一种传承
dobelee
2023-04-28 18:24:03 +08:00
一行没变少,反而增加几行初始化变量。。
voidmnwzp
2023-04-28 18:25:41 +08:00
@cholerae 不瞒你说 我就是看了 rob pike 写的 wrap 后才写的

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

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

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

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

© 2021 V2EX