Golang语言特性中的一些不足

相比于C语言,Golang提供了很多很方便的语言特性,比如切片的支持,比如GC,比如原生的map支持。使用Go会比直接使用C语言方便非常多。但是在使用中也会遇到很多不方便的地方,希望新版本的Go能提供更多的特性

这是一个持续更新的列表

没有泛型支持

作为一门09年诞生的语言,没有支持泛型其实是很不应该的。我们不知道为什么在设计go的时候没有把泛型加上,按照官方的说法,是还没有找到一种不是的设计变得非常复杂的实现泛型的方法,并且泛型对于他们来说并不是那么紧急,所以在go中,泛型一直是一个open issue,没有定论。

我们知道Java在1.5添加了泛型支持,但是java的泛型实现机制也是被很多人诟病的点。因为Java使用了运行时类型擦除的方式实现泛型,这种实现方式导致在运行时泛型是没有类型信息的,被退化成为了Object对象,可能导致运行时异常而不是编译期异常。相比而言C#提供的更原生的泛型支持。
虽然Java的泛型不被人喜爱,但是其实并不会太影响使用,而现在Go语言根本没有提供对泛型的支持,也导致很多基础方法不能被复用,比如排序算法需要对所有的类型提供不同的实现,这是很繁琐的工作。

其实,官方的说法也很有道理:泛型并不是那么的紧急,没有泛型是有些麻烦,但并不会导致不能工作。

好消息是Go的开发组已经在考虑添加泛型支持了,或许下个版本就能用上generic了。

没有三元运算符

这是这几天才发现的问题,对开发者而言,三元运算符(ternary operator ?:)是很基础的运算符。在学C语言时就用上了,以致我理所当然地认为左右的语言都会提供三元运算符了。

实际上现在的语言不仅仅提供三元运算符,还会提供改进的三元运算符。

c = a?0:a;
c = a?:0; // 一种更方便的三元运算

如上,在开发中进场碰到的一种场景是要判断取到的某个元素是否是null,然后再进行操作。为了简化操作,可以用第二行的方式,省略一个部分。这看起来简单,在实际使用时却是很方便的特性。

但是,golang现在连三元运算符都没有,只能使用if判断实现相同的效果。

if expr {
n = trueVal
} else {
n = falseVal
}

这样子确实有过于麻烦了,希望有一天golang能提供对 ternary testing operation的支持。

if语言必须要有大括号

这其实算不上缺点,go强制所有的if后必须要用大括号,即

if expr {
// operation here
}

这其实是几乎所有语言规范推荐的写法,但是很多时候我们喜欢这样写:

if (expr == true) break;

这样其实足够简洁明了,但是go中不允许这么写,必须要有大括号包围

if (expr == true) {
break
}

当判断较多的时候其实代码就很不好看了。

参考