2015-10-14 2 views
3

Как создать массив массивов int в Голанге, используя литералы среза?Создать массив литерала массива в Golang

Я попытался

test := [][]int{[1,2,3],[1,2,3]} 

и

type Test struct { 
    foo [][]iint 
} 

bar := Test{foo: [[1,2,3], [1,2,3]]} 
+4

Стоит повторить, что вы пытаетесь создать срез, а не массив. Чтобы создать массив, вы должны использовать тип [N] {42, 33, 567} или '[...] type {42, 33, 567}' -, чтобы получить размер, выводимый из числа членов в инициализатор. – kostix

+0

^Конечно, я предполагаю, что вы используете такие массивы так редко, и синтаксис настолько похож, что я в основном меняю два, даже если они разные. – praks5432

+0

Я бы не сказал, что использую их редко. В коде, который разбирает какой-либо сетевой протокол, принято декретировать массив, а затем повторять его несколько раз - передача этих фрагментов, являющихся видом окон в базовый массив, другим функциям. В любом случае: а) я думал, что у вас может быть неправильная модель в голове, которая нуждается в исправлении ;-) б) лучше не путать читателей, которые позже наткнутся на ваш пост. – kostix

ответ

7

Вы почти иметь правильную вещь, однако ваш синтаксис для внутренних массивов, немного смещенных, нуждающимся в фигурных скобках, как; test := [][]int{[]int{1,2,3},[]int{1,2,3}} или чуть более сжатая версия; test := [][]int{{1,2,3},{1,2,3}}

Выражение называется «составным литералом», и вы можете прочитать о них подробнее здесь; https://golang.org/ref/spec#Composite_literals

Но в качестве основного эмпирического правила, если у вас есть вложенные структуры, вы должны использовать синтаксис рекурсивно. Это очень много.

+1

Вам не нужно использовать тот же синтаксис для внутренних массивов: http: //play.golang .org/p/Wdhabb3qca – twotwotwo

+0

@twotwotwo true, что технически отличается и предпочтительнее. – evanmcdonnal

+1

Рад, что вы добавили более короткий пример, но ответ по-прежнему говорит: «Вы должны использовать синтаксис рекурсивно. Это очень многословно» и «вы должны использовать тот же синтаксис для внутренних массивов», которые кажутся запутанными или неточными, если вы считаете что внутренние срезы могут быть выписаны другим и более коротким образом. – twotwotwo

0

ломтиком буквальным записывается как []type{<value 1>, <value 2>, ... }. Кусочком ints будет []int{1,2,3}, а срез из целых участков будет [][]int{[]int{1,2,3},[]int{4,5,6}}.

groups := [][]int{[]int{1,2,3},[]int{4,5,6}} 

for _, group := range groups { 
    sum := 0 
    for _, num := range group { 
     sum += num 
    } 
    fmt.Printf("The array %+v has a sum of %d\n", sub, sum) 
} 
+2

Вам не нужно указывать типы значений: https://play.golang.org/p/Wdhabb3qca – twotwotwo

4

В некоторых других охват языков (Perl, Python, JavaScript), [1,2,3] может быть массивом буквальным, но в Go, composite literals используйте фигурные скобки, и здесь, вы должны указать тип внешнего среза:

package main 

import "fmt" 

type T struct{ foo [][]int } 

func main() { 
    a := [][]int{{1, 2, 3}, {4, 5, 6}} 
    b := T{foo: [][]int{{1, 2, 3}, {4, 5, 6}}} 
    fmt.Println(a, b) 
} 

Вы можете run or play with that on the Playground.

Компилятор Go просто достаточно сложный, чтобы выяснить, что элементы [][]int - это []int, не говоря об этом на каждом элементе. Однако вам нужно написать имя внешнего типа.

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