V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
lance6716
V2EX  ›  Go 编程语言

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

  •  
  •   lance6716 · 2022-02-11 21:24:58 +08:00 · 2985 次点击
    这是一个创建于 1016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

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

    @learningman 感觉可以通过注释来识别需要处理的函数,这样的话应该对 IDE 比较友好吧
    ysc3839
        7
    ysc3839  
       2022-02-11 23:14:04 +08:00
    @lance6716 要不然统一返回数据,要不然定义多个宏,让用户选择
    aloxaf
        8
    aloxaf  
       2022-02-11 23:24:12 +08:00   ❤️ 1
    mark 一下,说不定若干年以后这就是 go++ 的起源(
    cmdOptionKana
        9
    cmdOptionKana  
       2022-02-11 23:55:21 +08:00   ❤️ 1
    建议使用 Goland, 输入可以快捷自动补全,显示时可以精简显示,很美观。
    timpaik
        10
    timpaik  
       2022-02-12 00:15:56 +08:00 via Android
    或者和 rust 一样,加个问号向上抛?
    lance6716
        11
    lance6716  
    OP
       2022-02-12 00:17:21 +08:00
    @cmdOptionKana 怎么配置可以达到这个效果 😂 能省下我好多时间
    cmdOptionKana
        12
    cmdOptionKana  
       2022-02-12 08:09:39 +08:00
    @lance6716 就是默认效果,当时我第一次用就服气了,活该 JetBrains 赚钱。
    levinit
        13
    levinit  
       2022-02-12 09:28:38 +08:00 via iPhone
    @cmdOptionKana goland 岂不是能省很多精力时间
    lance6716
        14
    lance6716  
    OP
       2022-02-12 09:46:27 +08:00 via Android
    @cmdOptionKana 我一直用 goland ,没记得函数调用有这种宏啊,slice 的 aappend 倒是经常用
    cmdOptionKana
        15
    cmdOptionKana  
       2022-02-12 09:54:10 +08:00
    @lance6716 不是函数调用,是针对 if err != nil 的 snippet 和简化显示。也就是说,输入很方便,显示也很简洁,err 处理的问题就不存在了呀。
    lance6716
        16
    lance6716  
    OP
       2022-02-12 10:33:08 +08:00 via Android
    @cmdOptionKana 我这个可以处理函数有多个返回值,其中一个是 error ,以及自动填充合法的 return
    buffzty
        17
    buffzty  
       2022-02-12 16:09:04 +08:00
    go 本来就有类似 try catch 的写法 为什么要创造这种无用的东西呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2465 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:18 · PVG 08:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.