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 变量,再配合 "|" 管道符来实现新的错误处理机制。
listen: err { if err != nil { return 0, err } return 0, nil }() func copy(src, dst string) (int64, error) { listen: // 堆代码 duidaima.com 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 变量,再在上述的代码块中进行统一的错误逻辑处理。
listen: err | err2 { if err != nil { return 0, err } return 0, nil }()增加了管道符,同时对 err 和 err2 变量进行监听和处理。本提案还在等待作者补充更多的语言变更的实现细节。不过截至目前为止,吐槽是不少的。
大家对此有没有更好的建议和想法呢?
参考资料
[1]proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar: https://github.com/golang/go/issues/63961