BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Go 2将添加错误处理和泛型

| 作者 Sergio De Simone 关注 17 他的粉丝 ,译者 谢丽 关注 11 他的粉丝 发布于 2018年9月14日. 估计阅读时间: 6 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

Gophercon 2018大会上,Russ Cox介绍了将添加到Go 2的特性,包括错误处理和泛型,并透露了当前一些新特性提案的内容。

自去年在Gophercon 2017大会上宣布以后,Go 2就旨在克服这门语言的不足,同时,保持“成为开发大型系统的高效语言”的总目标不变。所谓大型系统是指包含许多并发交互服务以及由许多松散协调的工程师开发的大型代码库。

按照Cox的说法,在所有的Go开发者调查中,有三个领域的改进一直出现:包管理、错误处理和泛型。

根据InfoQ之前的报道,Go 1.11增加了模块,虽然尚处于试验阶段,经常会有修改。模块是共享同一个导入路径前缀的包的集合,提供了一种可以替代GOPATH定位项目依赖的方法。它们也是保证满足递归依赖关系的版本控制单位。

Cox表示,说到错误处理,Go当前的不足就明确并可以理解了。一个问题是,Go的错误处理方式强迫开发人员编写了太多样板代码,就像下面这个惯用模式所展示的那样:

value, err := DoSomething()
if err != nil {
  log.Println(err)
  return err
}

另外一个相关问题是,当把足够详细的信息传回调用者,包括文件名、行号等,Go并不会显式创建一个错误处理模型。提供这类详细信息并不难,但增加了样板代码。

为了修复所有这些问题,在Go 2中,当前的错误处理草案设计采用了一种新模式,基于:

  • check function(...)表达式,在句法上缩短了错误处理,同时保证其简单易懂;
  • handle语句,定义检查语句失败时应该执行的操作,而且可以更轻松地在单个位置添加准确的错误报告。

check/handle的结合可以有效简化错误处理,如下所示:

func OldErrorHandlingExample() error {

    hex, err := ioutil.ReadAll(os.Stdin)
    if err != nil {
        log.Fatal(err)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    data, err := parseHexdump(string(hex))
    if err != nil {
        log.Fatal(err)
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    os.Stdout.Write(data)
    return nil
}

func NewErrorHandlingExample() error {

    handle err {
        return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    hex := check ioutil.ReadAll(os.Stdin)
    data := check parseHexdump(string(hex))

    handle err {
        // 根据需要执行一些具体的操作
        // 例如,如果你打开了一个文件,就关闭它
    }

    os.Stdout.Write(data)

    return nil
}

重要的是,要考虑handle代码块链的词法,它们会从最下面往上执行,直到包含return语句的第一个代码块。

Go社区对于泛型的概念并不陌生,C++、Java等其他语言都包含这一概念。在一门语言中引入泛型的关键是,它允许如何定义参数类型以及它必须满足的约束,例如相等比较。据Cox介绍,把约束规范置于泛型规范之外,即从实现推断,会导致不良接口,在代码开发中特别容易遭到破坏。

在Go 2中,当前的泛型草案设计使用contract定义参数类型必须支持而实现时可以使用的操作,例如:

contract Equal(t T) {
  t == T
}

func Uniq(type T Equal)(in <-chan T) <-chan T {
    ...
    if v != n { ... }
    ...
}

Go 2当前的草案设计还仅仅是草案。现在,社区是时候参与进来了,帮助改进它们,使它们转化成官方提案。Go 1的开发不会停止。实际上,根据最初的计划,Go 2中向后兼容的特性将作为Go 1发布的一部分逐步发布,就像Go 1.11的模块支持那样,此后,该语言将开始包含任何破坏现有代码库兼容性的特性。

查看英文原文:Go 2 Gets off the Blocks: Feedback Requested on New Package Management, Error Handling, and Generics

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

没有异常处理 by Zou Kevin

没有异常处理的GO,基本上别想来企业开发领域,谁愿意写这么多无聊的代码?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT