黄东旭解析 TiDB 的核心优势
485
2020-03-05
内容来源:http://mp.weixin.qq.com/s?__biz=MzI3NDIxNTQyOQ==&mid=2247491011&idx=1&sn=cd025d0332e7a7e485fcc58b5d6b7a0b&chksm=eb163aa9dc61b3bfc72f2e1aa48d2aafdf0945e29798e936a45a845daf5ba7804cbd884702b0#rd
作者介绍:
Nick Cameron,PingCAP 研发工程师,Rust 语言核心成员。
感谢 Rust 语言中文社区伙伴们的翻译和审校:
翻译:尚卓燃
审校:吴聪、张汉东
总体印象
nil
:像 Rust 和 Swift 这样的语言已经去除了 null
的概念,并且消除了相关的一整类错误。Go 降低了一部分风险:没有空值(no null values),在 nil
和 0
之间进行区分。但其核心思想仍未改变,同样还会出现解空指针引用这种常见的运行时错误。易学性
Go 很精简。很多语言都试图让自己看起来小巧,但 Go 真正做到了这一点(这基本上是一件好事,我对这种自律精神印象深刻)。
标准库很出色(同样,也很小)。从生态系统中寻找并使用库程序非常容易。
几乎没有其他语言中所不具备的东西。Go 从其他既存语言中提取了很多内容,并进行完善,最后将它们很好地组合在一起。它在避免标新立异这一方面做了极大努力。
乏味的样板式代码
if err != nil { return err }
这样的样板式代码甚至比那些真正有价值的代码还要多。我喜欢的东西
编译时间:绝对快,可以确定要比 Rust 快得多。但实际上,它并没有我预期的那么快(对于中型到大型项目,我感觉它的速度只是与 C/C++ 相接近,或者稍微快一点。而我更加期待能够即时编译)。
协程(goroutine)和信道(channel):值得称赞的是,Go 为生成协程和使用信道提供了轻量级的语法。尽管只是一个小细节,却使 Go 的并发编程体验比其他语言更优越,它真正揭示了语法的力量。
接口:它们并不复杂,但是很容易理解和使用,并且在很多地方都很实用。
if ...; ... { }
语法:可以将变量的作用域限制在 if
语句真的很好。这与 Swift 及 Rust 中的 if let
起着相似的效果,但用途更为广泛(Go 没有像 Swift 和 Rust 那样的模式匹配,所以它无法使用 if let
)。
测试和文档注释都很容易使用。
Go 工具链非常友好:将所有东西都放在一个地方,而不需要在命令行上使用多个工具。
拥有垃圾收集器(GC):不用考虑内存管理真的会使编程更加轻松。
可变参数。
我不喜欢的东西
nil
切片:要知道 nil
、nil
切片和空切片三者都不相同,我敢保证我们只需要其中的两个,而不需要第三个。
枚举类型并不是第一公民:使用常量模拟枚举让人感觉是一种倒退。
不允许循环引用:这实际上限制了包在划分项目模块中的可用性,因为它变相鼓励了在一个包中堆积大量文件(或拥有大量零碎的小包,如果本该放在一起的文件四处分散,这也同样糟糕)。
switch
允许出现遗漏匹配的情况。
for ... range
语句会返回一对「索引/值」。要想只获取索引很容易(忽略值就好);但若要只获取值,则需要显式声明。在我看来,这种做法更应该颠倒过来,因为在大多数情况下,我更需要值而不是索引。
语法:
定义与用途存在不一致。
编译器有时会很挑剔(例如,要求或禁止尾随逗号);通过良好的工具可以缓解这种困扰,但是有时仍然会产生一些恼人的额外步骤。
使用多值返回类型时,类型上需要括号,但 return
语句中却不需要。
声明一个结构体需要两个关键字(type
和 struct
)。
采用大写命名法来标记公共或私有变量,看起来就像匈牙利命名法那样,但更糟糕。
隐式接口。我知道它也出现在我喜欢的东西中,但有时候它确实很惹人烦——特别是当你试图找出所有实现该接口的类型,或者哪些接口是为给定类型而实现的时候。
你无法在不同的包中编写带有接收器的函数,所以即使接口是「鸭子类型」的,你也不能为其他包中的类型实现这个接口,这使得它们的用处大大降低。
一致性
返回多个值和信道的语法很棒,但是这两个无法一起使用,因为没有元组类型。
能够用 for ... range
语句对数组和切片进行迭代,但对其他集合就无能为力了,因为它缺乏迭代器的概念。
像 len
或者 append
这样的函数是全局函数,但你自己的函数却无法转变成全局函数。这些全局函数只能使用内置类型。即便 Go「没有泛型」,它们也可以变得通用。
没有运算符重载,那么 ==
就会使人感到恼火。因为这意味着你不能在词典中使用自定义类型作为键,除非它们是可比较的。这一属性派生自类型结构,程序员无法重写该属性。
总结
欢迎大家在下方留言,说说你的 Go & Rust 体验吧:从入门到放弃,从放弃到精通,踩过的坑,流过的泪……或者说说它们的必杀优势。
⚠️理智探讨,Peace & Love.
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。