我刚开始学习golang
的一些基本知识,在查看数组定义语法时对我来说有点奇怪。
C ++ / C#/ Java都定义了多维数组,如:
int arr[X][Y][Z]; // C/C++
int[,,] arr = new int[X, Y, Z]; // C#
int[][][] multi = new int[X][Y][Z]; // Java
在go:
var arr [Z][Y][X]int32 // go
语法有什么优势?
答案 0 :(得分:7)
C#和Java的语法都受到C的启发,并继承了C语法的所有怪癖。关于Go has a different syntax:
的原因有一篇很好的文章Go语法
C系列之外的语言通常使用不同的类型语法 声明。虽然它是一个单独的点,但通常会出现这个名称 首先,通常后跟冒号。因此,上面的例子变成了 类似的东西(用虚构但说明性的语言)
x: int p: pointer to int a: array[3] of int
这些声明很清楚,如果详细 - 你只需要将它们读到 对。 Go从这里开始,但为了简洁起见 删除冒号并删除一些关键字:
x int p *int a [3]int
[3]int
的外观和方式之间没有直接的对应关系 在表达式中使用a。 (我们将在接下来回过头来指点 部分。)您可以通过单独的语法来获得清晰度。
答案 1 :(得分:2)
此类variable declaration(var
)的另一个方面是它被初始化为 zero value
这种初始化是递归完成的,因此,例如,如果没有指定值,则结构数组的每个元素都将其字段归零。
declaration is "backward" (coming from C):
在C中,概念是变量被声明为表示其类型的表达式,这是个不错的主意,但是类型和表达式语法不能很好地混合,结果可能会令人困惑;考虑函数指针。
Go主要分离表达式和类型语法,这简化了事情(使用前缀*作为指针是证明规则的例外)