越来越多的语言把类型放在变量的后面来定义,例如 Go 语言的变量申明:
var x int
var p *int
var a [3]int
这种做法并不是为了与众不同,而是为了更加清楚得将变量和变量类型区分开来,避免它们混淆在一起。
下面是 Go 语言一个函数变量的申明(相当于 C 语言里的函数指针):
var f func(func(int,int) int, int) func(int, int) int // f 是变量,f 后面是变量类型
上面的声明读起来很清晰,自左向右,究竟哪一个变量名是当前被声明的也容易看出来——因为变量名永远在首位(var 标识除外)。
但是,如果是 C 语言做同样的定义:
int (*(*fp)(int (*)(int, int), int))(int, int);
变量名被淹没在层层括号和星号之中,变量和类型混淆在一起,难以理解!这就是很多人对 C 语言产生心理阴影的地方。
再看指针和切片的定义,也很容易将变量和变量类型区分开了:
var p *int // p 是变量, *int 是类型
var a []int // a 是变量,[]int 是类型
闭包也变得更简单:
var c = func(a, b int) int { return a+b } (3, 4)