说起go语言相信大家应该都不陌生吧。我们在前几期的文章中就曾经给大家介绍过go语言的优势以及常见的一些学习方法,但是我们也都知道,没有任何一种编程语言是没有劣势的,所以今天我们就来聊聊go语言的不足之处。
语言使用字母大小写来决定标识符的可见性
以小写字母开头的标识符在包内可见,以大写字母开头的标识符是公开的。这样做可能是为了省掉public和private关键字,但是,字母大写已经被用来表示其他意思——比如类名的字母是大写的,常量完全是大写的。对于我来说,使用完全小写的字母来定义全局常量实在是有点不适应。
2.在Go语言里,结构体不会显式声明它实现了哪些接口,而是通过匹配方法签名来辨别
这种设计犯了一个根本性的错误:它假设两个方法如果有相同的签名就表示有相同的契约。在Java中,如果一个类实现了一个接口,它会告诉编译器它实现了接口的所有方法。如果一个方法返回布尔类型,接口的注释会写清楚它的值代表什么意思(比如,true表示成功,false表示失败)。
语言中没有异常,而是通过多个返回值来返回错误
语言里有很多“神奇”的行为
例如,如果我把源码文件命名为,在Mac上就编译不过去。而如果我凑巧把一个函数名定义成init(),在运行时它会自动被调用。这些都是“约定俗成而非配置(conventionoverconfiguration)”的表现。对于小型项目来说,这些都无关键要,但在大型项目中,它们会给你带来大麻烦。
5.因为Go语言的字母大写约定,很容易出现很多相同的标识符
比如,一些包名、结构体名和变量名都叫作item。在Java中,包名使用了全限定名,类名字母是大写的。有时候,我觉得Go代码不好阅读,因为可能无法一下子看出一个标识符的作用域是怎样的。
6.要进行Go代码自动生成并不容易
编译器太过敏感,一些未被使用的导入和变量也会导致构建失败。在生成大型文件时,它在一开始可能并不知道需要导入那些包,而且可能会出现包名冲突,这种冲突也不好处理,因为即使你知道包名,却不知道导入的符号来自哪里。即使你知道,生成的代码为了避免冲突也会强制使用别名。在Java中,这些问题可以通过使用全限定类名来解决,而在Go语言中是不能这样做的。
作者:Lawrence
节选:infoq
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。