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

    文章

    1669

    浏览量

    51083
  • go语言
    +关注

    关注

    1

    文章

    159

    浏览量

    9630

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    2025开源鸿蒙开发者激励计划正式启动

    11月21日,2025开放原子开发者大会盛大启幕,聚焦“AI共智,开源共享”主题,吸引了来自全球的开发者、企业技术领袖、社区维护及高校科研力量参会。作为大会的重要组成部分,开源鸿蒙技术分论坛同期
    的头像 发表于 11-27 14:44 340次阅读

    奔赴热AI,码力全开!Talkweb House@1024程序员日系列活动圆满收官

    1024程序员日”系列活动至此划上了一个圆满句号。本届1024程序员节以“AI构建世界,智能引领未来”为主题,广邀技术大咖、产业领袖、企业代表与全球开发者齐聚星城
    的头像 发表于 10-27 18:59 437次阅读
    奔赴热AI,码力全开!Talkweb House@1024<b class='flag-5'>程序员</b>日系列活动圆满收官

    2025开放原子开发者大会11月启幕

    开发者年度盛会即将登场!2025开放原子开发者大会将于11月21-22日,在北京北人亦创国际会展中心盛大召开。大会以“一切为了开发者”为主题,汇聚全球开源智慧——国内外优秀开发者、学术
    的头像 发表于 10-24 14:05 736次阅读

    NVIDIA DRIVE AGX Thor开发者套件重磅发布

    这款由 NVIDIA DriveOS 7 驱动的开发者套件能够帮助开发者们打造出更安全的智能汽车和交通解决方案。
    的头像 发表于 09-04 11:20 1008次阅读

    曙光网络SugonRI开发者社区正式上线

    在人工智能与工业深度融合的大潮中,工业软件正在成为推动产业升级的关键引擎。为了让更多开发者快速掌握工业级编程技术、共享行业实践成果,曙光网络正式推出开发者社区——曙睿(SugonRI)开发者网站
    的头像 发表于 09-04 09:58 717次阅读

    NVIDIA Jetson AGX Thor开发者套件重磅发布

    开发者与未来创造们,准备好迎接边缘AI的史诗级革新了吗?NVIDIA以颠覆性技术再次突破极限,正式推出Jetson AGX Thor开发者套件!作为继传奇产品Jetson AGX O
    的头像 发表于 08-28 14:31 1232次阅读

    【HZ-T536开发板免费体验】2 - 交叉编译仓颉编程语言程序开发板运行

    对现代语言特性的集成、全方位的编译优化与运行时实现,以及 IDE 工具链支持,为开发者缔造友好的开发体验和卓越的程序性能,便于开发者高效地完
    发表于 07-16 21:27

    匠芯创发布新版GUI开发工具 新增多国语言设置等功能

    、播放暂停、循环播放以及控制面板呼出等功能,为开发者在多媒体应用开发方面提供了有力支持。 AiUIBuilder自2024年推出以来,凭借其强大的功能和易用性,受到了众多开发者的青睐。V1.3.0
    发表于 07-16 13:54

    HDC 2025开发者主题演讲精彩回顾

    日前,华为开发者大会(HDC 2025)进入第二天,行业领袖、技术专家、全球开发者齐聚现场,共同见证这场科技盛会。在开发者主题演讲中,华为技术专家深入解析HarmonyOS的最新技术、体验创新以及
    的头像 发表于 07-09 11:20 1043次阅读

    全志科技亮相OpenHarmony开发者大会2025

    近日,OpenHarmony开发者大会 2025(OHDC.2025,以下简称“大会”)在深圳举办。大会正式发布了开源鸿蒙5.1 Release版本,举行了“开源鸿蒙应用技术组件共建启动、开源鸿蒙
    的头像 发表于 06-04 09:16 1952次阅读
    全志科技亮相OpenHarmony<b class='flag-5'>开发者</b>大会2025

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让
    的头像 发表于 04-27 13:44 654次阅读
    Java<b class='flag-5'>开发者</b>必备的效率工具——Perforce JRebel是什么?为什么很多Java<b class='flag-5'>开发者</b>在用?

    为何嵌入式开发者觉得 MCU 开发无趣,更倾向 MPU(Linux)?

    咱嵌入式圈子里,最近老能听见有人念叨:“搞 MCU 开发越来越没劲儿了,不如转 MPU(Linux)有意思。” 作为在这行摸爬滚打二十多年的老兵,我也算看明白了 —— 这事儿就像程序员从写单片机裸机
    的头像 发表于 04-25 10:48 652次阅读
    为何嵌入式<b class='flag-5'>开发者</b>觉得 MCU <b class='flag-5'>开发</b>无趣,更倾向 MPU(Linux)?

    阿里云升级通义灵码AI程序员,全面上线

    近日,阿里云宣布其备受瞩目的通义灵码AI程序员已正式全面上线,为开发者带来更为强大和便捷的编程辅助工具。 此次上线的通义灵码AI程序员,在功能上实现了全面升级。现在,它支持VS Code
    的头像 发表于 01-09 11:16 961次阅读

    OurBMC 24.12版本正式上线

    日前,经过社区开发者的共同努力,OurBMC 全新升级,24.12版本正式上线。
    的头像 发表于 01-07 13:45 1298次阅读

    开发者的开源鸿蒙故事

    近日,在以“一切为了开发者”为主题的“2024开放原子开发者大会暨首届开源技术学术大会”上,开源鸿蒙5.0 Release版本正式发布,备受各方关注。该版本在系统完备度、分布式创新、
    的头像 发表于 01-06 10:28 1221次阅读