4

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
Himanshu
  • 10,714
  • 6
  • 40
  • 58
user1050619
  • 18,448
  • 72
  • 220
  • 371
  • 3
    Possible duplicate of [What is a concise way to create a 2D slice in Go?](https://stackoverflow.com/questions/39804861/what-is-a-concise-way-to-create-a-2d-slice-in-go) – Keveloper Aug 14 '18 at 20:06

2 Answers2

4

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)
Adrian
  • 38,231
  • 5
  • 90
  • 87
3

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

cnst
  • 23,936
  • 4
  • 83
  • 114