--
来自: Golang-China ~ 中文Go语言技术邮件列表
详情: http://groups.google.com/group/golang-china
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
这个Hoare,不是rust的Hoare,是Go的CSP的祖师爷quicksort的发明人Hoare。他的这句话是发表在《皇帝的旧衣》一文。大家可以看看,rust是不是旧衣的堆叠?
fango
顺便提醒你一下,意见有没有道理不是说某个compiler大拿就能判定的。首先是不是大拿,多大拿另说,如果你问rob
pike,他肯定说Go比Rust好,rob和这个人比谁更大拿?Linus说C++ sucks,难不成C++程序员全换行业了?
自己专心做自己的事情就是了。
至于那句“作者竟然说学完C++的时间和用go写64个开源项目的时间一样多”,呵呵,他明显没看懂这个玩笑。
----------------------------------------------------------------------------------
Yours Sincerely
Kun
2012/3/8 lihui <ustc....@gmail.com>:
Go推出的主要目的之一就是G内部大东西太多了,系统级开发巨型项目非常痛苦,所以估计Go开发时和不同team都有沟通交流,要address的问题很多就是巨型开发team中的实际问题。举个例子,Go的interface就是专为大型应用项目设计的,原因大家也都知道吧。Go的优点在实际大型应用项目已经体现,而且不是说除了Google没人用,用了的人反馈是什么样的,大家估计也有所耳闻
总的来说,可能语言还新,还需要改善吧。但要说"不懂得",这个有点过了。
Dart team起点就不一样,因为javascript实在太......那个了。但Dart始终还是主营前端吧。这俩基本就没法比较。
----------------------------------------------------------------------------------
Yours Sincerely
Kun
2012/3/8 lihui <ustc....@gmail.com>:
>
不要迷信权威。说服别人用Go最好的办法不是拉出一帮名人说观点,而是做一个牛逼的项目和库出来,让别人主动想用
----------------------------------------------------------------------------------
Yours Sincerely
Kun
2012/3/8 laputa <ye.l...@gmail.com>:
另外,如果真心要比较语言和语言之间的差异,先从起源或者说设计目的讲起;
从语言设计出来后,首先要解决的问题来分析会比较容易避免口水战。
至少,在这点上 go 的目标很明确(还记得 go 官方对于 gui
开发的态度吧?)。rust 让人感觉并不清晰。没有银弹,但 rust
似乎想当银弹呢?
于 Thu,
至少,在这点上 go 的目标很明确(还记得 go 官方对于 gui
开发的态度吧?)。
现在对 GO 语言,我关注挺长时间,感觉作者们控制的很严格,很多很好的建议都被拒绝了,参见 golang-nuts 邮件组。有些建议,他们只需要做很少的工作,就能有很好的效果,他们就是拒绝改进。
--
现在对 GO 语言,我关注挺长时间,感觉作者们控制的很严格,很多很好的建议都被拒绝了,参见 golang-nuts 邮件组。有些建议,他们只需要做很少的工作,就能有很好的效果,他们就是拒绝改进。
不是不做,而是语言设计上的考虑吧。举个例子?
这个,GUI库明显不在Go Team的开发日程之内。我觉得用swig做一个其它GUI库(比如Qt)的绑定,像pyQt那样才是比较好的模式。
1. "Proposed new pkg/testing function" 建议为 pkg/testing 增加 AssertEqual()
2. "Last Gasp Call for Native Decimal Support" 建议增加与浮点数相对应的固定精度小数
3. "Using go run with #!" 建议gc编译器忽略.go文件中以#!开文的第一行
对。Less is more。有失才有得。
fango
2012/3/9 minux <minu...@gmail.com>:
> --
> 来自: Golang-China ~ 中文Go语言技术邮件列表
> 详情: http://groups.google.com/group/golang-china
> 官网: http://golang-china.org/
> IRC: irc.freenode.net #golang-china
> @golangchina
--
blog: http://weavesky.com
twitter: sparklezeng
weibo: sparklezeng
好吧,咱们就来谈谈你提出的 “简单、一致(正交性)” 和 KISS 原则:当你一次次用大篇幅文字向初学者解释那些原本应该很简单的问题时,你还谈什么“简单、一致、KISS原则”?与其一遍遍的解释,还不如自己(GO语言设计者开发者)多做一点工作,对GO语言和编译器做一些改动,把问题消弭于无形。以 “为什么 { 不能单独一行?” 为例,为什么呢,因为编译器会在上一行末尾自动添加一个分号,为什么自动加分号呢,因为编译器作者想省事!明明程序员没有写分号,你非要加分号,要说是编译器的内部处理细节也无所谓了,你还要把它公之于众,甚至反过来影响到程序员写代码的方式。这在编程史上恐怕真是绝无仅有!
好吧,咱们就来谈谈你提出的 “简单、一致(正交性)” 和 KISS 原则:
当你一次次用大篇幅文字向初学者解释那些原本应该很简单的问题时,你还谈什么“简单、一致、KISS原则”?
与其一遍遍的解释,还不如自己(GO语言设计者开发者)多做一点工作,对GO语言和编译器做一些改动,把问题消弭于无形。
以 “为什么 { 不能单独一行?” 为例,为什么呢,因为编译器会在上一行末尾自动添加一个分号,为什么自动加分号呢,因为编译器作者想省事!明明程序员没有写分号,你非要加分号,要说是编译器的内部处理细节也无所谓了,你还要把它公之于众,甚至反过来影响到程序员写代码的方式。这在编程史上恐怕真是绝无仅有!
其实,我更希望编程语言的开发者多做一些工作,让程序员们少做一些功课。因为,前者的工作虽然复杂,但只需做一次,就造福数百万程序员;而后者每人每天多写一行代码、多留一分迷惑,累加起来也是很大的浪费。
这个还是得第三方来做
比如说wxpython就不是python的官方库
不过现在go的第三方库的确不怎么给力
对于这个问题,我的理解是,一些强制性的规则,可以让人免于“布理当驴”的选择困境。简单粗暴,但有效~ :)
On Fri, Mar 9, 2012 at 5:47 PM, Liigo Zhuang <com....@gmail.com> wrote:好吧,咱们就来谈谈你提出的 “简单、一致(正交性)” 和 KISS 原则:当你一次次用大篇幅文字向初学者解释那些原本应该很简单的问题时,你还谈什么“简单、一致、KISS原则”?与其一遍遍的解释,还不如自己(GO语言设计者开发者)多做一点工作,对GO语言和编译器做一些改动,把问题消弭于无形。以 “为什么 { 不能单独一行?” 为例,为什么呢,因为编译器会在上一行末尾自动添加一个分号,为什么自动加分号呢,因为编译器作者想省事!明明程序员没有写分号,你非要加分号,要说是编译器的内部处理细节也无所谓了,你还要把它公之于众,甚至反过来影响到程序员写代码的方式。这在编程史上恐怕真是绝无仅有!看到这个,我第一个想到的是,Python 强制通过缩进来标识代码块的范围。我只是觉得这是品味问题,就好像一开始的 C 语言选择大括号作为代码块标识,而不是其他什么符号一样吧。
> 2012/3/9 Sparkle <pop...@gmail.com>
>
> > 这个还是得第三方来做
> >
> 恩 Go team说了他们不是专家。GUI这东西真不是随便谁都能设计得好的。
喏,我都说有人会记得 Go 官方的态度了……
Go 现在的任务,不是变成超级武器,先做好 Server side。
对于 GUI 这些更加上层的建筑,以后再说吧。
至于第三方库的问题,或者 wingui 的问题,其实就是一个聚焦点的问题。
我提交过一两个 patch 都被否了,在沟通过程中就发现,对于增加功能,
Go team 非常谨慎。
Go 现在的任务,不是变成超级武器,先做好 Server side。
对于 GUI 这些更加上层的建筑,以后再说吧。
至于第三方库的问题,或者 wingui 的问题,其实就是一个聚焦点的问题。
我提交过一两个 patch 都被否了,在沟通过程中就发现,对于增加功能,
Go team 非常谨慎。
--
--
--
go的设计初衷就“简单”,对于那些强大的功能设计一个强大的库,既保持了语法的简洁。又能高效运作不是更好么,相信大部人学习它,就是因为其简洁的语法。
--
不仅仅是generic的问题。 generic 在Go上基本是无解的,因为Go在设计之初就是考虑不提供泛型的,这就是为什么map( 还是个性能杀手) 等东西存在的原因。
其他不一致的地方有:
缺乏操作符重载
内置类型一概没有方法
v,ok:=map[x]中对ok的特殊处理
缺乏一般性的可调用对象的概念
对foreach的支持不对用户定义类型开放等等
值变量可以调用指针方法,而interface里的值就不行
make与new的存在
以前还有符号的Export和可赋值性强行绑定在一起,WTF!,不过好在现在似乎改过来了。可以说,Go里面到处充满着特殊处理,不是语言特性之间具有强相关性,就是补丁式的,所以不能理解这个正交性和一致性的说法是怎么来的。
这都是GO独有的问题,几乎其它所有编程语言都不存在这类问题。也就是说,大多数编程语言的开发者都想到了解决方案并且解决了。或者说,解决方案多到数不清,一个普通程序员都有很简单的解决方案:以 “{” 为例,取消“自动添加分号”不就行了吗?你自己为“省事”(想投机取巧)而引入的麻烦,还得要自己解决(局部重写编译器吧,这个不怪别人,你前面的工作
就没做好)。变量与接口的转换那个问题,在别的语言里怎么没有?还是你自己引入的易混淆的概念。怎么解决?令 var err = nil; return err; 等效于 return nil。这两者之间再细分的话(他们坚持细分),感觉走火入魔了。
我同意 " Worse is better " 。可是,以分号的使用为例:C语言要求所有语句以分号结尾,很明确;Python不需要以分号结尾,也很明确;偏偏GO整出来一个“程序员多数情况下不需要分号结尾,但某些情况下编译器会帮忙加上分号”,而且还把“什么情况自动加分号”大摇大摆地写入语言规范。在这个世界上,不需要以分号结尾的语言多了去了,象GO这样做事情做一半的少之又少,就不能彻底把分号去掉吗?没那么难吧?
囧,其实我想多听听“反面”观点呢,毕竟这世上不存在所谓完美的事物~窃以为,了解这些的过程中,可以学到的东西很多
缺乏一般性的可调用对象的概念——你举个例子说这个吧。
我记得好像谁还曾经说过Go语言的图像库中关于创建图像对象的方法也不止一种(有3到4种),还是构造函数来得统一一些。
想听听大家的看法。
2012/3/9 Liigo Zhuang <com....@gmail.com>:
> “make与new的存在”,我也想再吐吐槽。现在Go语言里创建对象的办法,大概有四种:new, make, struct literal,
> special func。假设某个pkg公开了一个struct A,怎么创建A类型的变量?我要先去文档里查查有没有 NewA()
> 之类的函数,如果有,一般来说你就不能用new(A)或A{...}这类方法初始化。这里又牵涉出Go对象没有构造函数的问题,正是因为没有构造函数,所以不能轻易使用new(A)或A{...}。如果核实了库作者没有提供NewA()函数,你就只能用new或A{...};等将来那个库升级又添加了NewA(),你旧代码还可能创建出未正确初始化的变量(编译器还没能力编译警告)。真是纠结。反而没有直接调用构造函数省心。
--
Yili Zhao
“make与new的存在”,我也想再吐吐槽。现在Go语言里创建对象的办法,大概有四种:new, make, struct literal, special func。假设某个pkg公开了一个struct A,怎么创建A类型的变量?我要先去文档里查查有没有 NewA() 之类的函数,如果有,一般来说你就不能用new(A)或A{...}这类方法初始化。这里又牵涉出Go对象没有构造函数的问题,正是因为没有构造函数,所以不能轻易使用new(A)或A{...}。如果核实了库作者没有提供NewA()函数,你就只能用new或A{...};等将来那个库升级又添加了NewA(),你旧代码还可能创建出未正确初始化的变量(编译器还没能力编译警告)。真是纠结。反而没有直接调用构造函数省心。
缺乏一般性的可调用对象的概念——你举个例子说这个吧。就是一个对象,可以作为函数来调用。这主要体现在需要回调函数的时候,由于Go中对象不能是可调用函数,因为单方法接口总是比回调函数更加一般(generic)些。所以Go倾向于使用只有一个方法的接口来解决这个问题,并且使用神奇的手法,将与接口方法签名等价的函数转型为满足该接口值。而在支持可调用函数的语言,如scala、dart中,则不存在这个问题,因此大量的使用函数参数而不是但方法接口。
但使用单方法接口是痛苦的,其一:闭包函数需要经过一层转换。其二:你不能在函数内部现场定义一个匿名的实现了该接口的类。
如果{是否可以单独一行只是个个人口味问题,我觉得可以不用深究。如果编程语言只是个个人使用产品,个性化是更好的选择,但作为团队开发,强制一些规则,能够统一还是统一为好。有几点不懂,请教一下:)1. 你自己为“省事”(想投机取巧)而引入的麻烦,还得要自己解决(局部重写编译器吧,这个不怪别人,你前面的工作就没做好)。
2. 变量与接口的转换那个问题,在别的语言里怎么没有?还是你自己引入的易混淆的概念。怎么解决?令 var err = nil; return err; 等效于 return nil。
我看到新闻(http://mobile.51cto.com/team-319531.htm)说豌豆荚1.0版基于.NET框架实现,而2.0版是基于Webkit实现的。
2012/3/9 qq wu <wuq...@gmail.com>:
--
Yili Zhao
不过现在每当想构思一个GUI类库的时候,我都走向了设计一个描述界面的声明式语言,然后用引擎解释执行。用看到的某个人得话来说,跟html很像,除了它不是html以外。。。。
2012/3/9 laputa <ye.l...@gmail.com>如果{是否可以单独一行只是个个人口味问题,我觉得可以不用深究。如果编程语言只是个个人使用产品,个性化是更好的选择,但作为团队开发,强制一些规则,能够统一还是统一为好。有几点不懂,请教一下:)1. 你自己为“省事”(想投机取巧)而引入的麻烦,还得要自己解决(局部重写编译器吧,这个不怪别人,你前面的工作就没做好)。因为gc编译器内部实现细节(没有处理到位),导致了 { 不能另起一行。“为保证编译速度”是其中一个理由。其实完全可以从编译器上入手取消这个限制,不应该因为编译器实现方面的内部细节而把这个限制写入语言规范(因为将来很可能会出现更好的编译器,即没有{的限制,也有很快的编译速度)。
2. 变量与接口的转换那个问题,在别的语言里怎么没有?还是你自己引入的易混淆的概念。怎么解决?令 var err = nil; return err; 等效于 return nil。var err = nil; return err; 和 return nil 这两段代码是不等价的,给很多人造成困扰。官方FAQ花费大段文字专门解释这个问题:http://tip.golang.org/doc/go_faq.html#nil_error ,而我越看越糊涂。我认为,修改编译器让两者一致,“保持最小惊讶度”,是最好的办法。如果坚持严格细分两者之间的细微差异,有点走火入魔的意思了,其它有interface的语言都没练到这一层。
这个就像在 C 语言中,字符串 NULL 和空串的区别。如果你理解了interface,也就不会犯这样的错误。Go语言的 interface 的非嵌入式设计,是我最喜欢的 Go 语言的特征,也正是因为这样的特征,是避免对象设计复杂化的一个重要原因,也是Go语言中不需要泛型的根本原因。
2012/3/9 Dang Allen <alle...@gmail.com>:
> 确实,现在DirectUI的思路已经是界面纯粹使用某种配置语言(目前使用xml居多)来描述,然后配合一个高效率的渲染引擎。
--
Yili Zhao
确实,现在DirectUI的思路已经是界面纯粹使用某种配置语言(目前使用xml居多)来描述,然后配合一个高效率的渲染引擎。
在 2012年3月9日 下午8:38,Yili Zhao <pan...@gmail.com> 写道:
2012/3/9 Liigo Zhuang <com....@gmail.com>我同意 " Worse is better " 。可是,以分号的使用为例:C语言要求所有语句以分号结尾,很明确;Python不需要以分号结尾,也很明确;偏偏GO整出来一个“程序员多数情况下不需要分号结尾,但某些情况下编译器会帮忙加上分号”,而且还把“什么情况自动加分号”大摇大摆地写入语言规范。在这个世界上,不需要以分号结尾的语言多了去了,象GO这样做事情做一半的少之又少,就不能彻底把分号去掉吗?没那么难吧?因为我既可以使用传统Go风格不写分号,我也可以用分号,把不同语句放到一行。这是个权衡。你是不可能完全去掉语句的结束符的(也就是;号在C/Go里面的作用),如果没有,那是因为回车就是。但是这所谓的隐式结束符就导致你无论如何不能把多个语句放到同一行了。
肯定是各有利弊。再说一点,把自动添加分号写入语言规范怎么了?Javascript也是。
2012/3/9 Dang Allen <alle...@gmail.com>:
> 恩,刚刚尝试了一下。豌豆荚2.0的运行效率还是没有DirectUI的方案高,启动时间较长,整个界面的观感带有明显的网页感,内存占用也很高。
--
Yili Zhao
我举的这个例子的核心是:在分号的问题上,Go语言凭空增加了规则的复杂性(既比C语言复杂,又比Python / JavaScript复杂),却没有带来额外的好处。这种 worse 也是 better 吗?请问 better 体现在哪里?
--
2012/3/9 minux <minu...@gmail.com>2012/3/9 Liigo Zhuang <com....@gmail.com>我同意 " Worse is better " 。可是,以分号的使用为例:C语言要求所有语句以分号结尾,很明确;Python不需要以分号结尾,也很明确;偏偏GO整出来一个“程序员多数情况下不需要分号结尾,但某些情况下编译器会帮忙加上分号”,而且还把“什么情况自动加分号”大摇大摆地写入语言规范。在这个世界上,不需要以分号结尾的语言多了去了,象GO这样做事情做一半的少之又少,就不能彻底把分号去掉吗?没那么难吧?因为我既可以使用传统Go风格不写分号,我也可以用分号,把不同语句放到一行。这是个权衡。你是不可能完全去掉语句的结束符的(也就是;号在C/Go里面的作用),如果没有,那是因为回车就是。但是这所谓的隐式结束符就导致你无论如何不能把多个语句放到同一行了。我举的这个例子的核心是:在分号的问题上,Go语言凭空增加了规则的复杂性(既比C语言复杂,又比Python / JavaScript复杂),却没有带来额外的好处。这种 worse 也是 better 吗?请问 better 体现在哪里?
也许那是未来,当桌面与网页的界限已经模糊的时候,但不是现在。
如果用C++调用Win32 API,要么自己重新进行封装,
要么使用MFC(但是需要MFC动态链接库的支持),
要么使用WTL。
Dang推荐哪一个?
2012/3/9 Dang Allen <alle...@gmail.com>:
> 不是,如果要强调运行速度,又强调内存占用,而对定制界面也没什么要求,那么最好的方式就是使用win32 api。
> 使用DirectUI除非花钱购买成熟的库,否则开源的几个库包括金山的,对于标准控件类型的支持都不好(比如最常见的listview),里面都只是实现到了刚好可以满足某个特别的应用。
--
Yili Zhao
缺乏一般性的可调用对象的概念——你举个例子说这个吧。就是一个对象,可以作为函数来调用。这主要体现在需要回调函数的时候,由于Go中对象不能是可调用函数,因为单方法接口总是比回调函数更加一般(generic)些。所以Go倾向于使用只有一个方法的接口来解决这个问题,并且使用神奇的手法,将与接口方法签名等价的函数转型为满足该接口值。而在支持可调用函数的语言,如scala、dart中,则不存在这个问题,因此大量的使用函数参数而不是但方法接口。
但使用单方法接口是痛苦的,其一:闭包函数需要经过一层转换。其二:你不能在函数内部现场定义一个匿名的实现了该接口的类。
以前大家都说闭包函数是穷人的对象,但从本质上来说,应该是穷人的可调用对象。make和new的存在其根源在于缺乏构造函数而产生的。
ok这种东西,我承认它是有效的,实际上Go的很多设计,都是有效的。不过,一个真正正交的语言,必然是魔幻语言,表示空间绝对地由各特征维度划定,没有被拍扁嘛,scala就是一个经典的例子。ps:关于那个ok,我一直希望err的返回值也能一样处理(从而更加一致了),即如果存在错误,但用户没有赋值给一个变量检查,就panic,而不是像现在一样,默默无声地运行下去,然后不知道在那一行就挂掉。 go现在鼓励的错误处理方式,比checkedException还要邪恶。
2012/3/9 minux <minu...@gmail.com>2012/3/9 lihui <ustc....@gmail.com>不仅仅是generic的问题。 generic 在Go上基本是无解的,因为Go在设计之初就是考虑不提供泛型的,这就是为什么map( 还是个性能杀手) 等东西存在的原因。不是,他们没找到好的解决办法。 原来roadmap文档上还包括这里呢。这个和对待异常处理态度真不一样。异常处理那是绝对不会有,这个是还在讨论。现在最关键的就是性能方面的考虑,参看Russ Cox的这个总结:The generic dilemma is this: do you want slow programmers, slow compilers and bloated binaries, or slow execution times?当然,第二点不应该是and的关系,好的编译器可以不造成binary bloat,但是slow compiler的问题是没办法解决的。其他不一致的地方有:hehe 不错 总结了这么多不一致的地方~缺乏操作符重载哪些操作符允许重载呢?还有这样是否真的有好处?会不会搞得像C++那样超级复杂?内置类型一概没有方法这个没啥问题,你只要定义一个alias就能设置方法了。用Ruby的人估计会有这个体会,如果大家都随意给内置类型加方法,很快就会乱套。所以内置类型不能添加方法。至于内置类型为啥没有内置方法的问题,我觉得如果不能定制有哪些方法,那么固定的一套就容易不够。而且更重要的一点是如果有了内置的方法,这就是语言spec的一部分了,这东西作为标准库里的函数是可以改的(主要添加),如果把他们放到语言spec里去就非常非常不容易改了。(改doc/go_spec.html似乎至少得得到几个核心人物的LGTM才能通过,标准库的改动就轻松得多)v,ok:=map[x]中对ok的特殊处理你是否有更好的处理?改成内置函数?其实我觉得v, ok这样的设计挺符合Go关于错误处理的一致性的。而且这种处理的好处也很明显,如果你v := map[x]那么也明确表明你不在乎x是否存在,就像 v, _ := somefunc()这样,明确告知你不愿意处理错误了。如果设计成一个函数,虽然也可以,但是map类型内置就真没必要了。缺乏一般性的可调用对象的概念你举个例子说这个吧。对foreach的支持不对用户定义类型开放等等这是个问题,而且我觉得会要解决的,类似Lua的方式就很好,况且Go是有closure的,那个方式+Go独有的Interface机制会有比较好的设计的,至少我这么认为,我没看过关于这个问题的讨论,不知道Go Team是什么态度。值变量可以调用指针方法,而interface里的值就不行我还没仔细想过这个问题的原因。暂时不能评论这个问题。make与new的存在是有点郁闷,有了literal的写法之后确实是可以去掉new的。以前还有符号的Export和可赋值性强行绑定在一起,WTF!,不过好在现在似乎改过来了。可以说,Go里面到处充满着特殊处理,不是语言特性之间具有强相关性,就是补丁式的,所以不能理解这个正交性和一致性的说法是怎么来的。正交性和一致性是语言的设计目标。但是不是唯一或者说最重要的目标。如果只考虑正交性的话,那语言我估计也就是Ruby比较接近了。性能受的影响太大了,真的。而且毕竟Go是想作新时代的C语言,有些东西必须得坚持。比如可以让程序员完完整整地控制struct在内存从的layout等等。所以有些东西还是不能考虑动态的(如果要正交地像Ruby那样的话)PS: 上面提到了C++, Ruby, Lua等若干种语言,但是我没有任何批评他们的意思。更多的时候是借鉴他们的设计,毕竟每个语言中都必须要有特定的tradeoff关系。我觉得只有把握了那个语言设计者考虑的“主要矛盾”才能理解那个语言的某些你觉得诡异的特性。当然,我肯定不是认为Go现在就是完美的。其实我上面也说了,有几个地方是我也觉得该改进的。
--
来自: Golang-China ~ 中文Go语言技术邮件列表
详情: http://groups.google.com/group/golang-china
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
为什么不传闭包?因为前面说了,在没有可调用对象的情况下,单方法接口比函数参数更具有一般性,因此在很多场合你设计api的时候,就不敢用函数参数,而是转而用单方法接口,既然是单方法接口,就不能直接传函数闭包,需要一层魔术变换。一个来自http包中的例子就是 Handler 接口。我在设计api的时候,就经常在此纠结。不敢直接用 xxxoo(f func(ResponseWriter, *Request))之类。
--
panic+recover+defer相当于不需要check的RuntimeException,可能比它还要好些,这点是不错的,当然dart也修复了Java的checkedException的问题。但 err的方式,就比checkedException还要糟糕了,而Go偏偏最鼓励这一点。