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)