0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go语言的开发者正着手准备开发2.0版本,程序员有太多话要说

DPVg_AI_era 来源:未知 作者:李倩 2018-08-31 09:04 次阅读

Go 2.0预计公布,在今天HackerNews引发众多讨论,众多Bug即将填补,设计草案抢先预览。

Go语言的开发者正着手准备开发2.0版本,并从以下三个方面发布了初步的设计方案(非官方正式版),以供社区开展讨论:

泛型(generics)

错误处理(error handling)

错误值语义(error value semantics)

Go 2.0的总体目标是解决无法扩展到大型代码库以及无法满足大型项目开发人员需求等问题。

泛型

改进目标

想必大多数用户都对Go语言的泛型会表示无奈,很多网友甚至会说“根本就没有泛型支持”。

Go 2.0的目标是通过允许带有类型参数的参数多态(parametric polymorphism)来解决编写Go库的问题。

除了预期的容器类型之外,还希望能够编写有意义的库来操作任意的map和channel值,并理想地编写能够同时操作[ ]byte和string值的多态函数。

Go的泛型必须明确记录对类型参数的约束,作为调用者和实现之间明确的强制协议。当调用者不满足这些约束或实现超出限制时,编译器需将错误清楚地报告出来。

Go中的多态性应该在编译和运行时都可以实现,这样,有关实现策略的决策就可以留给编译器来决定。这种灵活性将解决Go目前存在的一些难题。

草案设计

设计草案添加了一个新的语法,用于在类型或函数声明中引入类型参数列表,例如:

1typeList(typeT)[]T23funcKeys(typeK,V)(mmap[K]V)[]K4

参数化声明的使用,采用普通调用语法来提供类型参数:

1varintsList(int)23keys:=Keys(int,string)(map[int]string{1:"one",2:"two"})

这些示例中的概括不需要T,K和V类型:任何类型都可以。 通常,实现可能需要约束可以使用的类型。例如,我们可能想要定义一个Set(T),以列表或映射的形式实现,在这种情况下,类型T的值必须能够进行相等的比较。为了表达这一点,设计草案引入了contract的概念。contract就像一个函数体,说明了类型必须支持的操作。例如,要声明类型T的值必须是可比较的:

1contractEqual(tT){2t==t3}

错误处理

改进目标

Go 语言的错误处理是基于明确的目的而设计的。用户应该从函数中返回所有可能的错误,并且检查/处理这些返回值。和其他语言相比,这一点可能看起来有些繁琐和不人性化。

Go 2希望错误检查更加轻量级,减少用于错误检查的Go程序文本的数量。

还希望使编写错误处理变得更方便,从而提高程序员花时间处理错误的可能性。

且错误检查和错误处理必须保持显式,即在程序文本中可见。

草案设计

草案设计引入了两种新的句法形式。

首先,它引入一个检查表达式来检查f(x, y, z)或检查err,并标记一个显式错误检查。

其次,它引入了一个定义错误处理程序的handle语句。当错误检查失败时,它将控制转移到最内层处理程序,该处理程序将控制转移到它上面的下一个处理程序,以此类推,直到处理程序执行返回语句为止。例如:

1funcCopyFile(src,dststring)error{ 2handleerr{ 3returnfmt.Errorf("copy%s%s:%v",src,dst,err) 4} 5 6r:=checkos.Open(src) 7deferr.Close() 8 9w:=checkos.Create(dst)10handleerr{11w.Close()12os.Remove(dst)//(onlyifacheckfails)13}1415checkio.Copy(w,r)16checkw.Close()17returnnil18}

在不返回错误的函数中允许check/handle组合。例如,一下是一个有用却很简单的程序功能:

1funcmain(){ 2hex,err:=ioutil.ReadAll(os.Stdin) 3iferr!=nil{ 4log.Fatal(err) 5} 6 7data,err:=parseHexdump(string(hex)) 8iferr!=nil{ 9log.Fatal(err)10}1112os.Stdout.Write(data)13}

这么写会更简单、清晰:

1funcmain(){2handleerr{3log.Fatal(err)4}56hex:=checkioutil.ReadAll(os.Stdin)7data:=checkparseHexdump(string(hex))8os.Stdout.Write(data)9}

错误值语义

改进目标

也许用户对于Go的程序化的err有许多问题:这是一个RPCError吗?这是net.OpError吗?它适应net.Error的接口吗?这是os.PathError吗?

对于错误值,第一个问题,就是很难回答上述那些疑问。函数os.IsExist,os.IsNotExist,os.IsPermission和os.IsTimeout是主要问题。它们在通用性方面有两个缺陷:每个函数仅测试一种特定类型的错误,第二,每个函数只能理解非常有限数量的包类型。

第二个问题看似没什么,却也很重要:深度嵌套错误(nested error)的报告太难以阅读,并且没有留给额外的细节空间,比如程序中的相关文件位置。

针对上述存在的两个问题,Go 2首先希望能让程序的错误检查更容易,更不容易出错,以提高实际程序的错误处理和鲁棒性。其次,希望能够以标准格式打印带有附加细节的错误。

草案设计

这里有两个主要问题:错误检查和错误格式化,分别用两个不同的方案解决。需要保持与现有代码的互操作性,并允许包继续定义自身的错误类型的约束,指向定义错误实现可以满足的可选界面。

错误检查(Error inspection)

对于错误检查,设计草案遵循现有包(如github.com/pkg/errors)的规则,并为错误定义了一个可选接口,以返回错误包装链中的下一个错误:

1packageerrors23typeWrapperinterface{4Unwrap()error5}

例如,上面假设的WriteError需要:

1func(e*WriteError)Unwrap()error{returne.Err}

利用这种方法,方案设计中添加了两个新函数对错误打包:

1//Isreportswhethererroranyoftheerrorsinitschainisequaltotarget.2funcIs(err,targeterror)bool34//AscheckswhethererroranyoftheerrorsinitschainisavalueoftypeE.5//Ifso,itreturnsthediscoveredvalueoftypeE,withoksettotrue.6//Ifnot,itreturnsthezerovalueoftypeE,withoksettofalse.7funcAs(typeE)(errerror)(eE,okbool)8

错误格式(Error formatting)

对于错误格式,设计草案定义了根据错误来实现的可选接口:

1packageerrors23typeFormatterinterface{4Format(pPrinter)(nexterror)5}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48610
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8927

原文标题:Go 2.0发布在即,程序员有太多话要说

文章出处:【微信号:AI_era,微信公众号:新智元】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    薪资高、青春饭,是不是程序员=青楼?

    花期太短。技术迭代快,年龄大容易失业。 就这几年的互联网环境而言,不管是前端、Java、Android开发等等行业。已经感受到程序员不是太卷就是工作难找,薪资过低。以前高工现在拿着中低程序员薪资
    发表于 03-06 21:32

    感觉我国的程序员前景一片灰暗,是这样吗?

    程序员也分为好几等,在现在看来大部分的Android、Java、前端等等开发。已经看不到希望了,很多人都在边缘挣扎;刚看到一位Android开发者,过完年回公司就通知被裁;可见每年都会有很多互联网
    发表于 02-20 20:52

    鸿蒙开发者预览版如何?

    : 高清完整版,可在主页或qr23.cn/AKFP8k保存。 鸿蒙的趋势已经来到,许多Android、Java、前端的程序员也都听到风口。准备进入到鸿蒙的生态建设当中。所以2024是最好布局的时候,趁现在行业还没内卷。更多详细的鸿蒙
    发表于 02-17 21:54

    鸿蒙系统优缺点,能否作为开发者选择

    星河版已经是纯血鸿蒙,但是它的发展一些周期。生态圈的建立难度大,各大厂商加入鸿蒙原生开发需要时间累积。 鸿蒙开发人才空缺,由于鸿蒙作为一款新型的系统,程序员们都是从0学起。所以市面上很少有鸿蒙
    发表于 02-16 21:00

    您有一份OpenHarmony开发者论坛2023年度总结,请查收~

    2023 年 11 月,OpenHarmony 开发者论坛 1.0 版本正式上线。 感谢各位开发者对 OpenHarmony 的大力支持和热爱,成为 OpenHarmony 开发者论坛
    发表于 01-26 17:27

    1月18号“纯鸿蒙”千帆启航,程序员预备!

    。 如何正确看待鸿蒙? 我作为程序员来说,首先是看鸿蒙的发展、市场开发岗位、薪资以及前景。 这几年对鸿蒙的发展情况来分析,从2019年开始鸿蒙的出来今天,华为鸿蒙取得了很大的成就。从“不兼容
    发表于 01-16 22:13

    米哈游启动鸿蒙原生应用开发,给程序员带来了什么信息?

    保障。未来,华为将以AI为核心驱动力,以服务和硬件生态为生态平台,以“1+8+N\"的自研和生态伙伴产品为入口,打造全场景智慧生态。 ​ ​​ 作为程序员的话,是进入鸿蒙开发的最佳时机。大多数
    发表于 01-07 22:25

    诚邀报名 | GPT驱动的新程序员时代,开发者如何编程?

    模式,开发者们迎来了编程范式的全新变革。传统的编程不再局限于编写线性代码和优化逻辑,自然语言取而代之,成为了编程的新工具,这大大降低了开发的门槛。 如今,以ChatGPT、Copilot等为代表的AI工具,将全球的知识库和代码库
    的头像 发表于 12-11 22:20 326次阅读

    欢迎加入飞腾派开发者社区,感谢每一位开发者

    发烧友论坛一起策划了飞腾派开发板测评活动,受到了广大开发者的喜爱。 通过这次活动,飞腾派成功地吸引了众多高质量开发者的关注和参与,进一步扩大了其在开发者社区中的影响力。此次活动将电子
    发表于 12-11 16:11

    喜迎1024程序员节!祝各位开发者们“码”到“程”功!

    祝各位开发者们,节日快乐! 程序员(Programmer)是从事程序开发、维护的专业人员。 对于奋斗在一线的程序员们来说, 10月24日 是
    的头像 发表于 10-24 20:00 406次阅读
    喜迎1024<b class='flag-5'>程序员</b>节!祝各位<b class='flag-5'>开发者</b>们“码”到“程”功!

    准备花些时间学习RISC-V开发什么要注意的吗?

    ARM和RISC在架构、总线方式不一样,但对于开发者而言,并不关心这方面的差别,只想知道在开发上有什么需要注意的地方吗?二开发,对于程序员
    发表于 10-23 12:04

    各位开发者期待已久的开源鸿蒙开发者手机已经开放购买啦!!

    各位开发者期待已久的开源鸿蒙开发者手机已经开放购买啦!! “开源鸿蒙开发者手机”,本质上是手机形态的开发板,为广大 OpenHarmony 开发者
    发表于 10-10 18:32

    华为云 classroom 赋能|tookIT 助力开发者上云

    对于资深程序员而言,IDE 是必不可少的,它好比是剑客手中的宝剑,IDE 帮助程序员更快更丝滑的去编程,同时插件就是这把剑上的各种 Buff,为宝剑赋能,提供更好的升级打怪
    的头像 发表于 08-31 15:26 245次阅读
    华为云 classroom 赋能|tookIT 助力<b class='flag-5'>开发者</b>上云

    移植ARM DHCP服务器版本1程序员指南

    这本书由ARM DHCP服务器服务器软件提供, 假定ARM DHCP服务器移植源可以作为参考, 也假设您可以访问程序员的 C 和 ARM 组装语言指南。 程序员指南是为
    发表于 08-18 06:46

    ARMv8-A霓虹灯程序员指南

    程序员,如固件、设备驱动程序或android内核开发人员•希望为基于Arm的目标设备优化库或应用程序程序员•非常热衷于Raspberry
    发表于 08-08 07:25