前言
学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这东西,不同的语言大同小异,所以这也对语法的记忆造成了一定的难度,其实最好的方法应该是旁边有本书,随时可以拿过来查阅或者纠正。
Go 的初学者可能会有这样的疑问:为什么 Go 的声明语法与传统的其他 C 家族编程语言不太一样?在这篇文章中我们会比较这两种不同的方式,并且也会解释为什么。下面话不多说了,来一起看看详细的介绍吧。
C 变量
首先,让我们说说 C 中的语法。C 使用了一种不寻常的巧妙的方法来实现声明语法。我们不是用什么特殊的语法来描述类型,而是写一个表达式,这个表达式包含两个部分:被声明的变量和变量的类型。
int x;
上面这行代码声明了一个类型为 int 的变量 x。一般来说,为了弄清楚如何编写新变量的类型,可以先写一个含基本类型变量的表达式,然后将基本类型放在左边,将表达式放在右边。
因此,下面的声明:
int *p; int a[3];
描述的是 p 是一个指向 int 类型的指针,因为 ‘*p' 的类型为 int。而 a 是一个 int 类型的数组,因为 ‘a[3]' (这里请忽略下标的值 3,它只是说明数组的大小)的类型是 int。
那函数呢?在最开始的时候,C 的函数声明是将 参数的类型写在括号外面的,像这样:
int main(argc, argv)
int argc;
char *argv[];
{ /* ... */ }
再一次,我们可以看到 main 是一个函数,因为表达式 main(argc, argv) 返回了一个 int 类型的值。现在大家比较习惯写成这样:
int main(int argc, char *argv[]) { /* ... */ }
但是基本的结构还是一样的。
对于简单的类型来说这种巧妙的语法思想是能很好工作的,但是一旦类型变得复杂就会令人感到困惑了。非常经典的一个例子就是声明一个函数指针。遵循着规则,你得到了下面的这种写法:
int (*fp)(int a, int b);
fp 是一个指向函数的指针,因为如果你写一个表达式 (*fp)(a, b) 你会调用函数并得到一个 int 类型的值。那如果 fp 的其中一个入参它本身也是一个函数呢?
int (*fp)(int (*ff)(int x, int y), int b)
这就变得开始难以阅读了。
当然,我们可以在声明一个函数的时候去掉参数名,那么 main 函数可以声明成:
int main(int, char *[])
让我们回想一下,argv 是这样声明的,
char *agrv[]
通过把变量名放在中间来声明类似 char *[] 这样类型的时候其实是令人困惑的。










