请教一下怎么优雅的处理 go 中的 err

2019-05-24 08:51:41 +08:00
 d0m2o08
go 中大部分短赋值都会有一个 xx, err :=
难道要每次都 if err != nil 么
大佬都是用什么方式处理的?

func checkErr(err error) {
if err != nil{
panic(err)
}
}

这样貌似也很低级啊
9877 次点击
所在节点    Go 编程语言
62 条回复
keysona
2019-05-24 10:20:04 +08:00
习惯就好。

c 的返回也是这样写的。

一开始我写 java 的 try catch 也写吐了。

每个语言都有罗嗦烦人的地方。大部分情况只能你去适应了,不想适应就换语言吧。
keepeye
2019-05-24 10:22:39 +08:00
虽然写的很不爽,但不能否认,这样写出来的程序是比脚本语言写出来的更健壮一些。另外 try ... catch 也不见得有多好
dabaibai
2019-05-24 10:35:50 +08:00
这种比 try catch 要好,
写过 10 年 C++的 是这么认为的
SurfaceView
2019-05-24 10:36:29 +08:00
@Fule 完全同意,这 2 个点完全是 xxx 的存在,那个 err 我先不评价什么,毕竟是特性, 但是那个类型放后面
纯粹是为了跟别人不一样 而不一样。
impl
2019-05-24 10:37:41 +08:00
用上 rust,只想说没有 nil 和 null 的世界真美好。回去看以前写的 go 代码,一堆 nil 堆的像屎山一样。。
pmispig
2019-05-24 10:42:21 +08:00
@impl 老哥,rust 这么丑陋的语法和一堆符号是怎么克服的,我试了好多次想学,看着看着就想吐了。。
Kilerd
2019-05-24 10:46:35 +08:00
@pmispig #26 不是我吐槽你,Rust 除了显式生命周期难看一点以外,其他都比 Go 好多了好吗? 而且现在有 Miri 和 NLL 的支持,很少机会能写到显式生命周期了(除非写底层)
ZSeptember
2019-05-24 10:47:00 +08:00
跟异常一样,往上抛,调用方处理。
当然,如果是不能处理的错误,直接 panic 也没问题。
pmispig
2019-05-24 10:50:18 +08:00
@Kilerd 主要是各种符号太多了,看得我脑壳晕
gamexg
2019-05-24 10:50:27 +08:00
用 golang,打 err 自动补全 if,还算可以接受
Kilerd
2019-05-24 10:56:17 +08:00
@pmispig #29 可能我写习惯了,没发现有什么太多的符号(连 JS 的一半都没有呢)

|| 表示闭包
! 表示 宏
? 向上抛异常。

也就这几个比较特殊的
pmispig
2019-05-24 11:06:22 +08:00
@Kilerd
```
client.get(uri).and_then(|res| {
println!("Response: {}", res.status());

res.body().for_each(|chunk| {
io::stdout()
.write_all(&chunk)
.map_err(From::from)
})
});
```
有种一口气走到底的感觉,有点喘不过气。像以前 js express 那种回调层层嵌套,全是匿名函数的错觉...
beidounanxizi
2019-05-24 11:09:28 +08:00
看看 gopheracdamey 写的系列文章 楼主问的问题 go github wiki 有很多好资料 仔细找找不难发现
impl
2019-05-24 11:27:54 +08:00
@pmispig 把 book 看一遍,掌握 struct,enum,match,if let 这些东西先,觉得有意思了再继续深入
impl
2019-05-24 11:34:08 +08:00
@pmispig 已经开始支持 async/await,后面不用 and_then 这种写法。romio 了解一下
ICKelin
2019-05-24 11:36:16 +08:00
我觉得 go 的错误处理写法没啥问题,但是通常我写 go 是基本不会写 panic 和 recover 的。。
Hellert
2019-05-24 11:45:44 +08:00
Go 的错误处理除了啰嗦点,其实没什么大毛病,这点就是继承了 C 语言程序就是输入+输入出的设计,简单。try catch 这种也不是万能的。
错误处理 Go2 做了优化,应该会少写一些 if。

其实能和 Go 语言做比较的只有 C,拿其它语言和 Go 比都不是太恰当,比如指针这个概念,大多数现代语言都放弃了,但在 Go 中却是非常核心的东西。
还有面向对象的那一堆理论,Go 完全没有,怎么去和 Java 这种比较?
knowckx
2019-05-24 12:04:12 +08:00
通过编辑器的 snippets 来自动完成有关错误处理的代码,工作效率会高很多

if err != nil {
log.Err("%s", err)
}
impl
2019-05-24 12:19:02 +08:00
rob 想保持 go 简单和地道,现在关于 go 那些改进的方案,rob 说了,可能都不会合到 go2 里面。油管视频
<amp-youtube data-videoid="RIvL2ONhFBI" layout="responsive" width="480" height="270"></amp-youtube>其实 go 这门语言多年前就死了。go2 可能就是画出来的大饼,什么时候能出来,没人知道。
loading
2019-05-24 12:35:50 +08:00
我也有一个 FuckErr()

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

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

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

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

© 2021 V2EX