Golang Go语言中尝试通过预处理解决 `if err != nil {...}` 问题

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中尝试通过预处理解决 if err != nil {...} 问题

https://github.com/lance6716/errhell

输入:

package main

func main() { returnErr().try }

func returnErr() error { return nil }

输出:

package main

func main() { _err0 := returnErr() if _err0 != nil { return } }

func returnErr() error { return nil }

我是期望完成类似 gofmt 一样的程序,让 IDE 调用从而方便生成 if err != nil {...}。当然如果 IDE 甚至 go 自己做的话,解析类型系统更好,生成的代码也会更好。

求 PR


更多关于Golang Go语言中尝试通过预处理解决 `if err != nil {...}` 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

18 回复

没高亮,没补全。。。
而且 codegen 我个人不太喜欢,总感觉是抢编译器的活

更多关于Golang Go语言中尝试通过预处理解决 `if err != nil {...}` 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要是有类似 C++ 的宏就好了,虽然我写 C++ 的时候也从来不用 exception ,但是因为有宏,写起来不会这么恶心

没有宏就自己变换 AST🙃

应该可以用一个特定的闭包来标记需要处理的函数,就仍然可解析了。但这样写起来太复杂了,还不如自己写 err check

可以考虑用 C 预处理器处理
输入
<br>#define TRY(expr) _err0 := expr \<br> if _err0 != nil { \<br> return \<br> }<br><br>package main<br><br>func main() {<br> TRY(returnErr())<br>}<br><br>func returnErr() error {<br> return nil<br>}<br>
输出
<br>package main<br><br>func main() {<br> _err0 := returnErr() if _err0 != nil { return }<br>}<br><br>func returnErr() error {<br> return nil<br>}<br>
https://godbolt.org/z/qerczhEY9
不过这个方法不能生成换行,不知道是否符合 Golang 的要求

return 需要检查当前函数的返回值有几个、什么类型。可以看一下仓库 readme 里面测试文件链接

感觉可以通过注释来识别需要处理的函数,这样的话应该对 IDE 比较友好吧

要不然统一返回数据,要不然定义多个宏,让用户选择

mark 一下,说不定若干年以后这就是 go++ 的起源(

建议使用 Goland, 输入可以快捷自动补全,显示时可以精简显示,很美观。

或者和 rust 一样,加个问号向上抛?

怎么配置可以达到这个效果 😂 能省下我好多时间

就是默认效果,当时我第一次用就服气了,活该 JetBrains 赚钱。

goland 岂不是能省很多精力时间

我一直用 goland ,没记得函数调用有这种宏啊,slice 的 aappend 倒是经常用

不是函数调用,是针对 if err != nil 的 snippet 和简化显示。也就是说,输入很方便,显示也很简洁,err 处理的问题就不存在了呀。

我这个可以处理函数有多个返回值,其中一个是 error ,以及自动填充合法的 return

go 本来就有类似 try catch 的写法 为什么要创造这种无用的东西呢

在Golang(Go语言)中,if err != nil {...} 的处理模式非常常见,它用于错误处理。尽管这种模式有其明确的好处,比如明确和直接的错误处理路径,但在某些情况下,开发者可能会希望寻找一种更简洁或更具表达力的方式来处理错误。

预处理通常意味着在执行主要逻辑之前进行某些检查或准备工作。然而,在Go语言中,通过预处理来完全避免 if err != nil {...} 结构并不现实,因为Go语言的设计哲学强调简洁和明确,而不是通过魔法或预处理来隐藏错误处理逻辑。

尽管如此,有一些编程技巧可以帮助减少 if err != nil {...} 的重复和冗余,比如:

  1. 封装错误处理逻辑:将错误处理逻辑封装到函数或方法中,以减少重复代码。
  2. 使用辅助函数:创建一些辅助函数来处理常见的错误情况,例如日志记录、错误消息格式化等。
  3. 利用Panics和Recover:在特定情况下,可以使用Panics和Recover来处理不可恢复的错误,但这通常不推荐用于常规错误处理。

尽管有这些技巧,但 if err != nil {...} 仍然是Go语言中处理错误的主要方式。它简单明了,易于理解和维护。开发者应该接受这种模式,并寻找在特定情况下减少其冗余的方法,而不是试图完全避免它。

回到顶部