[译文] 关于 Golang 的一个令我深深叹服的特性

2014-07-13 11:42:34 +08:00
 jemygraw
http://golanghome.com/post/155
4769 次点击
所在节点    Go 编程语言
41 条回复
hhkbp2
2014-07-13 13:43:52 +08:00
这也是为什么我发现Go的设计者拒绝糟糕的异常和泛型设计。他们就是想做正确的事情,当然他们知道这需要花费时间。

------
没有泛型,我写代码多花了很多时间
jemygraw
2014-07-13 13:51:04 +08:00
@hhkbp2 转换下思路。
SoloCompany
2014-07-13 13:57:32 +08:00
真能扯,这也能深深叹服,还顺带黑一下泛型和异常
guotie
2014-07-13 13:58:25 +08:00
异常没啥用
泛型还是很好的。
hhkbp2
2014-07-13 13:58:41 +08:00
@jemygraw 转换成什么
raincious
2014-07-13 14:04:32 +08:00
嗯?我怎么记得在哪儿看过这篇文章?……

好吧,可能是原文。

感谢楼主翻译。
dndx
2014-07-13 14:07:34 +08:00
这哪能叫什么特性,更像是帮助不合格的程序员写出正确的代码的 Hack 。

我没读过 Go 里 Hash Table 的实现,但是 range 遍历竟然与添加顺序相同本来就很怪异。如果 Golang 通过修改实现使其变成乱序遍历那的确无伤大雅,如果是故意在遍历时添加随机因素,那就是不信任程序员的编程能力,不一定是好事。
jemygraw
2014-07-13 14:14:05 +08:00
@raincious 嗯,多谢。
jemygraw
2014-07-13 14:15:43 +08:00
@dndx 你说的对,这篇文章本来没有什么用处,但是就体现了一个问题,那就是做事认真。如果你做事情会导致别人犯错误,那么就是你的不对。所以就是要改。

文章里面也说了,这个不是什么大不了的问题。

只是表明一点:态度!
jemygraw
2014-07-13 14:17:25 +08:00
@hhkbp2 那样看你想实现什么。如果大家都希望每一个新的编程语言都和老的完全一样,那么新的就没有意义了。
raincious
2014-07-13 14:20:36 +08:00
@jemygraw 但是,最好做成集合帖。如果大量主题一个一个刷屏,恐怕L会警告或者删掉的。
hhkbp2
2014-07-13 14:32:58 +08:00
@jemygraw
语言不是为了标新立异而创造的,而是为了解决问题
有缺点就承认咯,为什么顾左右而言他
jemygraw
2014-07-13 14:36:16 +08:00
@raincious 嗯,不发了。
jemygraw
2014-07-13 14:42:03 +08:00
@hhkbp2 语言当然是为了解决问题而存在。但是存在以下的问题。
1. 语言发展的成熟度问题,比如java8里面才加了lambda表达式
2. 语言解决问题的思路问题,不同语言解决问题的方式是不同的,这是差异性的问题。你要接受和了解这种差异,举例子就是java有的go不一定有或者一定没有,但是不表示go遇到问题无法解决。
3. 文章很清楚的讲一个问题,就是map的元素插入顺序和遍历顺序的不一致的问题。这个问题开始的时候也是不一致的,或者说按照道理就是不一致的,只是实现上是一致的,现在google发现很多人依赖这种一致性,就改了。而作者就是表达了对google的这种做事的态度表示赞赏。
4. 哪里顾左右而言他???
dorentus
2014-07-13 14:50:01 +08:00
如果我没记错的话,Map/Associative array/Dictionary 如果想要做到“range 遍历竟然与添加顺序相同”,是要以牺牲性能为代价的,或者是把 key 顺序另外保存;无论采用那种方法,对于没有“range 遍历竟然与添加顺序相同”的用户,都是吃力不讨好的事情;真要说态度的话,这种完全可以分成两个数据结构来做,一个正常的 Map,一个可以做到“range 遍历竟然与添加顺序相同”的 Map。
jemygraw
2014-07-13 15:00:19 +08:00
@dorentus
1. 你的想法是对的,就是把key另外排序,我也做过。
2. 其实如果真遇到那种key,value必须按照插入顺序读取的,我觉得完全可以用set和list来搞定。
set存储key,list存储值。
3. java里面有TreeMap,就是key排序的,HashMap就是随机的。
hhkbp2
2014-07-13 15:19:54 +08:00
@jemygraw
没有泛型写起代码来很累就是缺点咯,文章说拒绝泛型是做正确的事情,不同苟同
实际真的有这种需求如何解决,难道每个类型都要写一遍?所谓“做正确的事情”如何解决一线程序员的实际痛点?
在这个问题上,你所说的什么新语言要与老语言不同,语言成熟度,差异性,在我看来就是顾左右而言他,只是说由于各种原因不做泛型,而没有直接面对或解决泛型的需求

这个range顺序的事情本来就是必须的,语言本份应该做的,这都来个“深深叹服”,好吧,有句广告语说得好,在台风口上什么动物都能吹上天
jemygraw
2014-07-13 15:28:41 +08:00
@hhkbp2 http://coolxing.iteye.com/blog/1536200

上面的例子供参考,以后不发了,有污尊眼,敬请谅解。
hhkbp2
2014-07-13 15:44:54 +08:00
@jemygraw 接口+适配只能解决一部分,而且多了一层,本来编译器可以自动​推导的事情,由人去手工写一遍
jemygraw
2014-07-13 15:52:09 +08:00
@hhkbp2 嗯,我觉得你可以不用Go,选择java比较好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/122390

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX