5

I need to create a 2 dimensional string array as shown below -

matrix = [['cat,'cat','cat'],['dog','dog']]

Code:-

package main

import (
    "fmt"
)

func main() {
    { // using append

    var matrix [][]string
    matrix[0] = append(matrix[0],'cat')
        fmt.Println(matrix)
    }
}

Error:-

panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
    /tmp/sandbox863026592/main.go:11 +0x20
1

2 Answers 2

6

You have a slice of slices, and the outer slice is nil until it's initialized:

matrix := make([][]string, 1)
matrix[0] = append(matrix[0],'cat')
fmt.Println(matrix)

Or:

var matrix [][]string
matrix = append(matrix, []string{"cat"})
fmt.Println(matrix)

Or:

var matrix [][]string
var row []string
row = append(row, "cat")
matrix = append(matrix, row)
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks, How do I add the same element to 2 position(for the last option given). append(matrix,row) by default adds to the first element...
@user1050619 initialize your outer matrix first (as in the first example).
append(matrix,row) does not add to the first element, it adds the row to the matrix.
5

The problem with doing two-dimensional arrays with Go is that you have to initialise each part individually, e.g., if you have a [][]bool, you gotta allocate []([]bool) first, and then allocate the individual []bool afterwards; this is the same logic regardless of whether you're using make() or append() to perform the allocations.

In your example, the matrix[0] doesn't exist yet after a mere var matrix [][]string, hence you're getting the index out of range error.

For example, the code below would create another slice based on the size of an existing slice of a different type:

func solve(board [][]rune, …) {

    x := len(board)
    y := len(board[0])
    visited := make([][]bool, x)
    for i := range visited {
        visited[i] = make([]bool, y)
    }
…

If you simply want to initialise the slice based on a static array you have, you can do it directly like this, without even having to use append() or make():

package main

import (
    "fmt"
)

func main() {
    matrix := [][]string{{"cat", "cat", "cat"}, {"dog", "dog"}}
    fmt.Println(matrix)
}

https://play.golang.org/p/iWgts-m7c4u

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.