68

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

 5 years ago
source link: http://www.infoq.com/cn/news/2018/09/go-2-draft-designs?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK