为什么Go语言把类型放在后面

Yang 856

Go语言把类型放在后面是为了可读性。这种方式可以避免出现C语言中那样含糊不清的声明形式:int* a, b; —其中只有 a 是指针而 b 不是。Go语言的设计者认为,从编程和数学两方面来看,都有一个约定,即计算的结果在右侧表示,所以在类C语言中,类型在左侧是很奇怪的。

一、Go 语言语法可读性

 非C家族的语言通常在声明时使用一种不同的类型语法。一般是名字先出现,然后常常跟着一个冒号。例如:

x: int

p: pointer to int

a: array[3] of int

 这样的声明即便有些冗长,当至少是清晰的——你只需从左向右读就行。Go 语言所采用的方案就是以此为基础的,但为了追求简洁性,Go 语言丢掉了冒号并去掉了部分关键词,成了下面这样

x int

p *int

a [3]int

在 [3]int 和表达式中 a 的用法没有直接的对应关系。至此,你获得了代码清晰性方面的提升,但付出的代价是语法上需要区别对待。

虽然在 Go 语言里,main 函数实际上没有参数,但是之前的 main 函数的声明:

func main(argc int, argv *[]byte) int

 粗略一看和 C 没什么不同,不过自左向右读的话还不错。

  main 函数接受一个 int 和一个指针并返回一个 int。

如果此时把参数名去掉,它还是很清楚——因为参数名总在类型的前面,所以不会引起混淆。

func main(int, *[]byte) int

 这种自左向右风格的声明的一个价值在于,当类型变得更复杂时,它依然相对简单。下面是一个函数变量的声明(相当于 C 语言里的函数指针)

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

或者当它返回一个函数时:

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

上面的声明读起来还是很清晰,自左向右,而且究竟哪一个变量名是当前被声明的也容易看懂——因为变量名永远在首位。

类型语法和表达式语法带来的差别使得在 Go 语言里调用闭包也变得更简单:

sum := func(a, b int) int { return a+b } (3, 4)

延伸阅读

1、类型前置

在业内目前有不少知名语言,也采取的是在声明变量类型时,把类型定义在名字前面。像是 C、C++、C#、Java 等:

int x;

int x = 100;

基本的格式定义:<data_type> <variable_list>;。

上面的声明是一个简单的例子,如果更复杂一些,Go 官方还给出了知名的函数指针的例子:

int (*fp)(int a, int b);

更进一步,如果返回值也是个函数指针类型,就会变成:

int (*(*fp)(int (*)(int, int), int))(int, int)

这已经很难看出来是个 fp 的声明了。

2、类型后置

前面所举例的类型前置的编程语言,很多都是 C 系列中的一者。类型后置的代表,分别有:Go、Rust、Scala、Kotlin 等。

其实在很多类型后置的编程语言种,会采取变量名+冒号+类型的方式出现。就像 Rust 一样:

let x: i32;

基本的格式定义:

x: int

p: pointer to int

a: array[3] of int

Go 官方参照了这类类型后置的设计,并且为了简洁,进一步去掉了冒号和一些关键字,变成:

var a []string

我们再看回前面 fp 的声明的例子:

int (*(*fp)(int (*)(int, int), int))(int, int)

再对比 Go 语言中就变成了:

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

两者一对比,Go 语言代码可读性确实更高一些。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部