我一直很好奇,Go语言为什么要采用这种把类型放在后面的声明方式。今天得空来学习一下:
首先,我们来看一下c语言的声明方式:
int x;这是一个典型的c语言声明,它声明了一个整型的变量x。这样看来c语言的声明还算是简单明了,但是当遇到指针声明,尤其是函数指针的时候,问题就变得复杂了,就不是一眼能够看清楚的了:
int (*fp)(int (*ff)(int x, int y), int b)上面声明了一个函数指针fp,该函数带有连个参数,第一个是一个函数指针,第二个是一个整数,我们知道c语言声明的时候是可以不带变量名的,于是,上面的声明可以修改为下面的这个样子:
int (*fp)(int (*)(int, int), int)这样的表达已经有点看不清楚了,如果函数的返回值也是函数指针:
int (*(*fp)(int (*)(int, int), int))(int, int)
哦,我的天啊,杀了我吧……………………,还能很轻松的看出来谁是谁不?这变得连他妈都不认识了。
下面,我们来看看Go语言的声明方式:
也有很多非类c的语言,才有了变量名前置的声明方式:
x: int p: pointer to int a: array[3] of int但是,这个方式还是有点繁琐,于是Go做了简化,删除了冒号和部分关键字:
x int p *int a [3]int现在我们直接将上面的c语言的声明:
int (*(*fp)(int (*)(int, int), int))(int, int)修改为Go的声明方式:
f func(func(int,int) int, int) func(int, int) int怎么样,这样子读起来是不是比较顺畅了。虽然也去掉了变量名,但是好不妨碍我们从左向右读取,理解也很方便。
不过,Go语言在变量名后置方面也没有做的太彻底:
例如:声明 var p *int
在使用的时候就变成了*p,不过这也是没有办法的事情,因为,如果继续写为p*,这个时候很容易和表示乘法的型号混淆。
以上就是个人的一些见解,不足之处还请大家一起讨论讨论……
有疑问加站长微信联系(非本文作者)