golang为[z] [y] [x] int定义数组int [x] [y] [z]有什么好处? [关闭]

I just start to learn some basic of golang, it is little strange for me when looking at the array define syntax.

C++/C#/Java all defines multi-dimensional arrays like:

int arr[X][Y][Z]; // C/C++
int[,,] arr = new int[X, Y, Z]; // C#
int[][][] multi = new int[X][Y][Z]; // Java

And in go:

var arr [Z][Y][X]int32 // go

what is the advantage about the syntax?

The Syntaxes of C# and Java were both inspired by C and inherit all the quirks of the C syntax. There is a nice article on why Go has a different syntax:

Go syntax

Languages outside the C family usually use a distinct type syntax in declarations. Although it's a separate point, the name usually comes first, often followed by a colon. Thus our examples above become something like (in a fictional but illustrative language)

x: int
p: pointer to int
a: array[3] of int

These declarations are clear, if verbose - you just read them left to right. Go takes its cue from here, but in the interests of brevity it drops the colon and removes some of the keywords:

x int
p *int
a [3]int

There is no direct correspondence between the look of [3]int and how to use a in an expression. (We'll come back to pointers in the next section.) You gain clarity at the cost of a separate syntax.

Another aspect of this kind of variable declaration (var) is that it is initialized to a zero value

This initialization is done recursively, so for instance each element of an array of structs will have its fields zeroed if no value is specified.

The declaration is "backward" (coming from C):

In C, the notion is that a variable is declared like an expression denoting its type, which is a nice idea, but the type and expression grammars don't mix very well and the results can be confusing; consider function pointers.

Go mostly separates expression and type syntax and that simplifies things (using prefix * for pointers is an exception that proves the rule)