皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

Go 公布 2.0 设计草案:主打规?;屠┱剐?,支持泛型

必威平台 www.gddgtsmy.com 去年 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

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

转自 https://www.oschina.net/news/99490/go-2-draft-designs

分享到:更多 ()