praks5432
praks5432

Reputation: 7792

Create array of array literal in Golang

How do I create an array of int arrays in Golang using slice literals?

I've tried

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

and

type Test struct {
   foo [][]int
}

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

Upvotes: 40

Views: 70810

Answers (4)

NurShomik
NurShomik

Reputation: 237

Just replace the square brackets with curly braces. In Go, array literals are identified with curly braces.

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

Upvotes: 6

evanmcdonnal
evanmcdonnal

Reputation: 48086

You almost have the right thing however your syntax for the inner arrays is slightly off, needing curly braces like; test := [][]int{[]int{1,2,3},[]int{1,2,3}} or a slightly more concise version; test := [][]int{{1,2,3},{1,2,3}}

The expression is called a 'composite literal' and you can read more about them here; https://golang.org/ref/spec#Composite_literals

But as a basic rule of thumb, if you have nested structures, you have to use the syntax recursively. It's very verbose.

Upvotes: 59

twotwotwo
twotwotwo

Reputation: 30037

In some other langauges (Perl, Python, JavaScript), [1,2,3] might be an array literal, but in Go, composite literals use braces, and here, you have to specify the type of the outer slice:

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)
}

You can run or play with that on the Playground.

The Go compiler is just tricky enough to figure out that the elements of an [][]int are []int without you saying so on each element. You do have to write out the outer type's name, though.

Upvotes: 7

Ben Campbell
Ben Campbell

Reputation: 4678

A slice literal is written as []type{<value 1>, <value 2>, ... }. A slice of ints would be []int{1,2,3} and a slice of int slices would be [][]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)
} 

Upvotes: 2

Related Questions