编译时间:绝对快,可以确定要比 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)。采用大写命名法来标记公共或私有变量,看起来就像匈牙利命名法那样,但更糟糕。隐式接口。我知道它也出现在我喜欢的东西中,但有时候它确实很惹人烦——特别是当你试图找出所有实现该接口的类型,或者哪些接口是为给定类型而实现的时候。你无法在不同的包中编写带有接收器的函数,所以即使接口是「鸭子类型」的,你也不能为其他包中的类型实现这个接口,这使得它们的用处大大降低。
Go 缺少泛型和宏。
网友评论