刷到一个比较骚的 Go 错误处理新提案。。。

大家好,我是煎鱼。

在比较一段长的时间里,Go 的错误处理已经没有什么特别的进展和新改进了。看着已经到了瓶颈期。

今天在 GitHub 上学习时,看到 Go 社区里有人提了个错误处理的优化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》,也是引入新的语法来解决该问题。

大家一起来看看,也集思广益一下。原提案作者的目的是新增一个 listen 关键字和配合管道符等语法来实现新的错误处理。

原本的 Go1 代码,我们在处理错误时需要使用 if err != nil。如下代码:

go 复制代码
func copy(src, dst string) (int64, error) {
    r, err := os.Open("input.txt")
    if err != nil {
        return 0, err
    }
    defer r.Close()
 
    w, err := os.Create("output.txt")
    if err != nil {
        return 0, err
    }
    defer w.Close()
    
    if _, err = io.Copy(w, r); err != nil {
        return 0, err
    }
    return 0, err
}

本提案的变化是:新增一个 listen 关键字,用于监听 err 变量,再配合 "|" 管道符来实现新的错误处理机制。

如下演示代码:

go 复制代码
listen: err {
    if err != nil  {
        return 0, err
    }
    return 0, nil
}()

func copy(src, dst string) (int64, error) {
    listen:
    
    r, err := os.Open("input.txt")
    defer r.Close()
 
    w, err := os.Create("output.txt")
    defer w.Close()

    _, err = io.Copy(w, r) 
}

listen 关键字监听了 err 变量,再在上述的代码块中进行统一的错误逻辑处理。

如果是多个 err 变量,会是如下处理方式:

go 复制代码
listen: err | err2 {
    if err != nil  {
        return 0, err
    }
    return 0, nil
}()

增加了管道符,同时对 err 和 err2 变量进行监听和处理。

本提案还在等待作者补充更多的语言变更的实现细节。不过截至目前为止,吐槽是不少的。

大家对此有没有更好的建议和想法呢?

Go 的新错误处理的改造方向真的是让人头大。我这边有记载被 ban 的错误处理合集都已经有许多了。停滞不前中。

文章持续更新,可以微信搜【脑子进煎鱼了】阅读,本文 GitHub github.com/eddycjy/blo... 已收录,学习 Go 语言可以看 Go 学习地图和路线,欢迎 Star 催更。

推荐阅读

相关推荐
程序设计实验室2 小时前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题2 小时前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉2 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想
asaotomo2 天前
一款 AI 驱动的新一代安全运维代理 —— DeepSentry(深哨)
运维·人工智能·安全·ai·go
码界奇点3 天前
基于Gin与GORM的若依后台管理系统设计与实现
论文阅读·go·毕业设计·gin·源代码管理
迷迭香与樱花3 天前
Gin 框架
go·gin
只是懒得想了3 天前
用Go通道实现并发安全队列:从基础到最佳实践
开发语言·数据库·golang·go·并发安全
fenglllle4 天前
使用fyne做一个桌面ipv4网段计算程序
开发语言·go
码界奇点5 天前
基于Wails框架的Ollama模型桌面管理系统设计与实现
go·毕业设计·llama·源代码管理
csdn_aspnet6 天前
Go语言常用算法深度解析:并发与性能的优雅实践
后端·golang·go