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
![]() | 1 learningman 2022-02-11 22:02:46 +08:00 没高亮,没补全。。。 而且 codegen 我个人不太喜欢,总感觉是抢编译器的活 |
2 littlewing 2022-02-11 22:05:32 +08:00 要是有类似 C++ 的宏就好了,虽然我写 C++ 的时候也从来不用 exception ,但是因为有宏,写起来不会这么恶心 |
![]() | 3 lance6716 OP @littlewing 没有宏就自己变换 AST |
![]() | 4 lance6716 OP @learningman 应该可以用一个特定的闭包来标记需要处理的函数,就仍然可解析了。但这样写起来太复杂了,还不如自己写 err check |
![]() | 5 ysc3839 2022-02-11 23:04:25 +08:00 @littlewing 可以考虑用 C 预处理器处理 输入 ``` #define TRY(expr) _err0 := expr \ if _err0 != nil { \ return \ } package main func main() { TRY(returnErr()) } func returnErr() error { return nil } ``` 输出 ``` package main func main() { _err0 := returnErr() if _err0 != nil { return } } func returnErr() error { return nil } ``` https://godbolt.org/z/qerczhEY9 不过这个方法不能生成换行,不知道是否符合 Golang 的要求 |
![]() | 6 lance6716 OP @ysc3839 return 需要检查当前函数的返回值有几个、什么类型。可以看一下仓库 readme 里面测试文件链接 @learningman 感觉可以通过注释来识别需要处理的函数,这样的话应该对 IDE 比较友好吧 |
8 aloxaf 2022-02-11 23:24:12 +08:00 ![]() mark 一下,说不定若干年以后这就是 go++ 的起源( |
![]() | 9 cmdOptionKana 2022-02-11 23:55:21 +08:00 ![]() 建议使用 Goland, 输入可以快捷自动补全,显示时可以精简显示,很美观。 |
![]() | 10 timpaik 2022-02-12 00:15:56 +08:00 via Android 或者和 rust 一样,加个问号向上抛? |
![]() | 11 lance6716 OP @cmdOptionKana 怎么配置可以达到这个效果 能省下我好多时间 |
![]() | 12 cmdOptionKana 2022-02-12 08:09:39 +08:00 @lance6716 就是默认效果,当时我第一次用就服气了,活该 JetBrains 赚钱。 |
![]() | 13 levinit 2022-02-12 09:28:38 +08:00 via iPhone @cmdOptionKana goland 岂不是能省很多精力时间 |
![]() | 14 lance6716 OP @cmdOptionKana 我一直用 goland ,没记得函数调用有这种宏啊,slice 的 aappend 倒是经常用 |
![]() | 15 cmdOptionKana 2022-02-12 09:54:10 +08:00 @lance6716 不是函数调用,是针对 if err != nil 的 snippet 和简化显示。也就是说,输入很方便,显示也很简洁,err 处理的问题就不存在了呀。 |
![]() | 16 lance6716 OP @cmdOptionKana 我这个可以处理函数有多个返回值,其中一个是 error ,以及自动填充合法的 return |
17 buffzty 2022-02-12 16:09:04 +08:00 go 本来就有类似 try catch 的写法 为什么要创造这种无用的东西呢 |