Как создать массив массивов int в Голанге, используя литералы среза?Создать массив литерала массива в Golang
Я попытался
test := [][]int{[1,2,3],[1,2,3]}
и
type Test struct {
foo [][]iint
}
bar := Test{foo: [[1,2,3], [1,2,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]]}
Вы почти иметь правильную вещь, однако ваш синтаксис для внутренних массивов, немного смещенных, нуждающимся в фигурных скобках, как; 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
Но в качестве основного эмпирического правила, если у вас есть вложенные структуры, вы должны использовать синтаксис рекурсивно. Это очень много.
Вам не нужно использовать тот же синтаксис для внутренних массивов: http: //play.golang .org/p/Wdhabb3qca – twotwotwo
@twotwotwo true, что технически отличается и предпочтительнее. – evanmcdonnal
Рад, что вы добавили более короткий пример, но ответ по-прежнему говорит: «Вы должны использовать синтаксис рекурсивно. Это очень многословно» и «вы должны использовать тот же синтаксис для внутренних массивов», которые кажутся запутанными или неточными, если вы считаете что внутренние срезы могут быть выписаны другим и более коротким образом. – twotwotwo
ломтиком буквальным записывается как []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)
}
Вам не нужно указывать типы значений: https://play.golang.org/p/Wdhabb3qca – twotwotwo
В некоторых других охват языков (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
, не говоря об этом на каждом элементе. Однако вам нужно написать имя внешнего типа.
Стоит повторить, что вы пытаетесь создать срез, а не массив. Чтобы создать массив, вы должны использовать тип [N] {42, 33, 567} или '[...] type {42, 33, 567}' -, чтобы получить размер, выводимый из числа членов в инициализатор. – kostix
^Конечно, я предполагаю, что вы используете такие массивы так редко, и синтаксис настолько похож, что я в основном меняю два, даже если они разные. – praks5432
Я бы не сказал, что использую их редко. В коде, который разбирает какой-либо сетевой протокол, принято декретировать массив, а затем повторять его несколько раз - передача этих фрагментов, являющихся видом окон в базовый массив, другим функциям. В любом случае: а) я думал, что у вас может быть неправильная модель в голове, которая нуждается в исправлении ;-) б) лучше не путать читателей, которые позже наткнутся на ваш пост. – kostix