螺旋形(C/C++)和顺序(Go)的声明语法

这篇文章指出,C/C++的声明语法(declaration syntax)的读法是顺时针螺旋形的。一个例子是:

                     +--------------------+
                     | +---+              |
                     | |+-+|              |
                     | |^ ||              |
                char *(*fp)( int, float *);
                 ^   ^ ^  ||              |
                 |   | +--+|              |
                 |   +-----+              |
                 +------------------------+

读作:“fp是一个指针,指向一个函数(螺旋路径被fp右边的括号封死,绕到左边的*),有一个整形和一个浮点指针参数(两个参数一起读因为他们被一个括号括起来了),并返回一个指针,指向一个字符”。

而这篇发表于Go blog 上的文章给出了一个对比:

f func(func(int,int) int, int) func(int, int) int

的读法是顺序的:“f是一个函数,他的参数包括一个函数,有两个整数参数并返回一个整数,和一个整数,并且返回一个函数,他有两个整数参数并返回一个整数”。

进一步说,C/C++的声明语法(declaration syntax)和表达式语法(expression syntax)是一致的。比如上面例子里,*(*fp)( int, float *) 的类型就是 char。

而Go的声明语法和表达式语法是不一样的。这样的区别的好处不只是读起来方便(我理解是按照英语语法),而且让“写”程序也方便,比如定义一个closure:sum := func(a, b int) int { return a+b } (3, 4)