Go 公布 2.0 设计草案:主打规模化和扩展性,支持泛型

来源: 投稿
作者: 王练
2018-08-31 07:46:53

去年7月,Go 语言官博就曾透露 Go 2 开发计划,并表示 Go 2 的目标就是解决 Go 1.x 在规模化方面做的还不够好的地方随着时间的推进,开发团队已着手准备 2.0 版本的开发工作,并公布了设计草案,供社区讨论和反馈,以促进最终的语言设计。

设计草案包含三个方面,错误处理、错误值和泛型,并针对各个方面进行了详细的概述和改进草案。大致总结如下:

一、错误处理(Error handling)

为扩展至大型代码库,Go 程序必须是轻量级的,不会过度重复,且具备稳健性,能够优雅地处理出现的错误。

目前 Go 检查错误的代码太多,但处理这些错误的代码却严重不足。对于 Go 2,开发团队希望错误检查更加轻量级,减少用于错误检查的 Go 程序的文本量。此外,还能更加方便地编写错误处理程序,提高开发者处理错误的可能性。

为避免处理重复异常,错误检查和错误处理还必须是显性的,在程序文本中可见。

参考示例:

func main() {
	hex, err := ioutil.ReadAll(os.Stdin)
	if err != nil {
		log.Fatal(err)
	}

	data, err := parseHexdump(string(hex))
	if err != nil {
		log.Fatal(err)
	}

	os.Stdout.Write(data)
}

简化后:

func main() {
	handle err {
		log.Fatal(err)
	}

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

二、错误值(Error values

大型程序必须能够以编程方式测试和响应错误,并且还能很好地报告它们。

目前的各种流行的助手工具包添加了超出标准错误接口的功能,但它们以不兼容的方式执行。对于 Go 2,开发团队考虑将“可选接口”标准化,以允许这些工具包进行互操作,并慢慢减少对它们的需求。

改进主要包含两个目标:一是让程序的错误检查更容易,更不容易出错,以提高程序的错误处理和稳健性;二是希望能够以标准格式打印包含额外细节的错误。

// Is reports whether err or any of the errors in its chain is equal to target.
func Is(err, target error) bool// As checks whether err or any of the errors in its chain is a value of type E.// If so, it returns the discovered value of type E, with ok set to true.// If not, it returns the zero value of type E, with ok set to false.
func As(type E)(err error) (e E, ok bool)

三、泛型(Generics)

想要扩展到大型代码库,代码的可重用性非常重要。

Go 团队在早期其实一直有在调查和讨论“泛型”的可能性设计,但由于种种原因,Go 1 更多的是确保能快速构建包含很多独立软件包的程序。

Go 2 的目标是通过允许带有类型参数的参数多态来解决编写 Go 库的问题,这些问题抽象出了不必要的类型细节。

此外,除了预期的容器类型之外,开发团队还希望能编写有用的库来操作任意的 map 和 channel 值。理想方案是编写能够同时操作 [ ]byte 和 string 值的多态函数。

type List(type T) []T

func Keys(type K, V)(m map[K]V) []K

更多细节请查阅设计草案页面。

展开阅读全文
点击加入讨论🔥(52) 发布并加入讨论🔥
本篇精彩评论

引用来自“xshrim”的评论

什么defer,recover,panic,现在又来了handle,check,感情go省的关键字全给错误和异常了。

引用来自“吉姆测试机”的评论

defer不是错误和异常才用的
层主对 defer居然是这种看法,看来根本不懂golang的设计哲学。handle,check目前看来就是个语法糖,和golang原先错误处理的哲学不冲突,希望那些说恶心,太丑了的同学,深入使用一下golang,多写一些项目,多看一下一些大型项目的源代码再来发表你们的情绪。对于我一个已经工作中使用golang四年多的同学来说,golang现在一切都不错,未来也会更好。我也并不是只会golang,其他语言也使用了很多年,语言用其优,避其坑就好,如果一门语言你觉得很顺手,那就用下去。这么多年编程经历,我的体会是,如果有一门语言你觉得顺手,很大一部分原因是因为它的设计哲学合你的意,语义表达自然亲切度合你的意。多了解几门语言,体会不同的设计哲学没什么坏处,还有就是艺多不压身,一理通百理通,相互映照,最后都是殊途同归。程序员要有包容的心态和少吐槽多体会的心态。
2018-08-31 10:47
15
举报

引用来自“xshrim”的评论

弄个try catch就这么难么,非得搞得这么怪异。
go 根本就没有异常,如何try...catch呢? 如果简单地草案上的handle替换成try...catch,那只捕捉函数作用域的error,又会显得跟其他语言不一致,如果想try...catch和其他语言一样,那go就要彻底修改,目前所有的库都会不兼容
2018-08-31 08:28
9
举报
世界上只有两种语言: 一种是没人用的, 一种是被人骂的
2018-08-31 09:12
5
举报
一堆错误处理的关键词,弄个 try-catch 会死?
2018-08-31 09:05
5
举报

引用来自“xshrim”的评论

什么defer,recover,panic,现在又来了handle,check,感情go省的关键字全给错误和异常了。

引用来自“吉姆测试机”的评论

defer不是错误和异常才用的

引用来自“终于19岁”的评论

层主对 defer居然是这种看法,看来根本不懂golang的设计哲学。handle,check目前看来就是个语法糖,和golang原先错误处理的哲学不冲突,希望那些说恶心,太丑了的同学,深入使用一下golang,多写一些项目,多看一下一些大型项目的源代码再来发表你们的情绪。对于我一个已经工作中使用golang四年多的同学来说,golang现在一切都不错,未来也会更好。我也并不是只会golang,其他语言也使用了很多年,语言用其优,避其坑就好,如果一门语言你觉得很顺手,那就用下去。这么多年编程经历,我的体会是,如果有一门语言你觉得顺手,很大一部分原因是因为它的设计哲学合你的意,语义表达自然亲切度合你的意。多了解几门语言,体会不同的设计哲学没什么坏处,还有就是艺多不压身,一理通百理通,相互映照,最后都是殊途同归。程序员要有包容的心态和少吐槽多体会的心态。
事实上,我接触的好几年前就开始使用golang的同学,基本都是有很多其他语言经验,大量实际项目根底的同学。这些同学,敢于尝试,心态都很open,希望现在还只是在评论区发表情绪,没有实际使用或更深入体会的同学能静下心来,多把时间用于好奇心,探索,体会和修炼内功上。我最近也在尝试一些其他语言,祝大家好运
2018-08-31 10:55
4
举报
52 评论
16 收藏
分享
返回顶部
顶部