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

2022-02-11 21:24:58 +08:00
 lance6716

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

3015 次点击
所在节点    Go 编程语言
17 条回复
learningman
2022-02-11 22:02:46 +08:00
没高亮,没补全。。。
而且 codegen 我个人不太喜欢,总感觉是抢编译器的活
littlewing
2022-02-11 22:05:32 +08:00
要是有类似 C++ 的宏就好了,虽然我写 C++ 的时候也从来不用 exception ,但是因为有宏,写起来不会这么恶心
lance6716
2022-02-11 22:48:19 +08:00
@littlewing 没有宏就自己变换 AST🙃
lance6716
2022-02-11 22:51:59 +08:00
@learningman 应该可以用一个特定的闭包来标记需要处理的函数,就仍然可解析了。但这样写起来太复杂了,还不如自己写 err check
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 的要求
lance6716
2022-02-11 23:12:26 +08:00
@ysc3839 return 需要检查当前函数的返回值有几个、什么类型。可以看一下仓库 readme 里面测试文件链接

@learningman 感觉可以通过注释来识别需要处理的函数,这样的话应该对 IDE 比较友好吧
ysc3839
2022-02-11 23:14:04 +08:00
@lance6716 要不然统一返回数据,要不然定义多个宏,让用户选择
aloxaf
2022-02-11 23:24:12 +08:00
mark 一下,说不定若干年以后这就是 go++ 的起源(
cmdOptionKana
2022-02-11 23:55:21 +08:00
建议使用 Goland, 输入可以快捷自动补全,显示时可以精简显示,很美观。
timpaik
2022-02-12 00:15:56 +08:00
或者和 rust 一样,加个问号向上抛?
lance6716
2022-02-12 00:17:21 +08:00
@cmdOptionKana 怎么配置可以达到这个效果 😂 能省下我好多时间
cmdOptionKana
2022-02-12 08:09:39 +08:00
@lance6716 就是默认效果,当时我第一次用就服气了,活该 JetBrains 赚钱。
levinit
2022-02-12 09:28:38 +08:00
@cmdOptionKana goland 岂不是能省很多精力时间
lance6716
2022-02-12 09:46:27 +08:00
@cmdOptionKana 我一直用 goland ,没记得函数调用有这种宏啊,slice 的 aappend 倒是经常用
cmdOptionKana
2022-02-12 09:54:10 +08:00
@lance6716 不是函数调用,是针对 if err != nil 的 snippet 和简化显示。也就是说,输入很方便,显示也很简洁,err 处理的问题就不存在了呀。
lance6716
2022-02-12 10:33:08 +08:00
@cmdOptionKana 我这个可以处理函数有多个返回值,其中一个是 error ,以及自动填充合法的 return
buffzty
2022-02-12 16:09:04 +08:00
go 本来就有类似 try catch 的写法 为什么要创造这种无用的东西呢

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

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

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

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

© 2021 V2EX