做者介绍:程序员
Nick Cameron,PingCAP 研发工程师,Rust 语言核心成员。golang
感谢 Rust 语言中文社区伙伴们的翻译和审校:编程
翻译:尚卓燃数组
审校:吴聪、张汉东安全
整体印象微信
nil
:像 Rust 和 Swift 这样的语言已经去除了
null
的概念,而且消除了相关的一整类错误。Go 下降了一部分风险:没有空值(no null values),在
nil
和
0
之间进行区分。但其核心思想仍未改变,一样还会出现解空指针引用这种常见的运行时错误。
易学性并发
Go 很精简。不少语言都试图让本身看起来小巧,但 Go 真正作到了这一点(这基本上是一件好事,我对这种自律精神印象深入)。app
标准库很出色(一样,也很小)。从生态系统中寻找并使用库程序很是容易。函数
几乎没有其余语言中所不具有的东西。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「没有泛型」,它们也能够变得通用。没有运算符重载,那么
==
就会令人感到恼火。由于这意味着你不能在词典中使用自定义类型做为键,除非它们是可比较的。这一属性派生自类型结构,程序员没法重写该属性。
总结
本文分享自微信公众号 - GoCN(golangchina)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。