2016-08-05 2 views
4

Есть ли явная инициализация массива (объявление и присвоение) в GO или единственный способ использования сокращенного оператора? Вот практический пример - это два равны:Инициализация явного массива GO

a := [3]int{1, 0, 1} 

var a [3]int = [3]int{1, 0, 1} 

ответ

7

Они эквивалентны. В общем: Spec: Short variable declaration:

короткой декларация переменной используется синтаксис:

ShortVarDecl = IdentifierList ":=" ExpressionList . 

Это сокращение для регулярного variable declaration с инициализатором выражениями, но нет типов:

"var" IdentifierList = ExpressionList . 

Так что эта строка:

a := [3]int{369, 0, 963} 

равносильна этому:

var a = [3]int{369, 0, 963} 

Но так как в списке выражения является composite literal типа [3]int, следующие одно и то же:

var a [3]int = [3]int{369, 0, 963} 

Spec: Variable declaration:

Если тип присутствует, каждой переменной присваивается этот тип. В противном случае каждой переменной присваивается тип соответствующего значения инициализации в присваивании.

Таким образом, вы можете использовать любой из следующих, все объявлять и инициализировать переменную типа [3]int:

a := [3]int{369, 0, 963} 
b := [...]int{369, 0, 963} 
var c = [3]int{369, 0, 963} 
var d [3]int = [3]int{369, 0, 963} 
var e [3]int = [...]int{369, 0, 963} 
var f = [...]int{369, 0, 963} 

Примечания:

Обратите внимание, что в составных литералов, она действует до не перечислять все значения. Элементы, значение которых явно не указано, будет zero value типа элемента. Вы можете включить необязательный индекс перед значением в перечислении, чтобы указать элемент, значение которого оно будет.

Spec: Composite literals:

Для получения массива и среза литералов применяются следующие правила:

  • Каждый элемент имеет связанный с ним целое индекс маркировки своей позиции в массиве.
  • Элемент с ключом использует ключ в качестве индекса; ключ должен быть константным целочисленным выражением.
  • Элемент без ключа использует индекс предыдущего элемента плюс один. Если первый элемент не имеет ключа, его индекс равен нулю.

Поскольку ваш первоначальный массив содержит 0, который является нулевым значением для типа int элемента, вы можете исключить его из буквальных. Для того, чтобы создать и инициализировать переменную в значение [3]int{369, 0, 963}, вы также можете сделать это следующим образом:

// Value at index 1 implicitly gets 0: 
g := [3]int{369, 2: 963} 
h := [...]int{369, 2: 963} 

Попробуйте все примеры на Go Playground.

Смотрите этот вопрос более подробно + практические примеры: Keyed items in golang array initialization

Смежные вопросы