在Golang中创建二维字符串数组

5

我需要创建一个如下所示的二维字符串数组 -

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

代码:

package main

import (
    "fmt"
)

func main() {
    { // using append

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

错误:-

panic: runtime error: index out of range

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

3
可能是如何在 Go 中创建一个二维切片的简洁方法?的重复问题。 - Keveloper
2个回答

6

您有一个切片的切片,外层切片在初始化之前是nil

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

或者:

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

或者:

var matrix [][]string
var row []string
row = append(row, "cat")
matrix = append(matrix, row)

谢谢,我如何将相同的元素添加到两个位置(对于给定的最后选项)?append(matrix,row)默认添加到第一个元素... - user1050619
@user1050619 首先初始化你的外部矩阵(就像第一个例子中那样)。 - Adam Smith
1
append(matrix,row) 不会添加到第一个元素,它会将行添加到矩阵中。 - Adrian

3
在Go语言中使用二维数组的问题在于您必须逐个初始化每个部分,例如,如果您有一个[][]bool,则首先必须分配[]([]bool),然后才能分配单个的[]bool。无论您是使用make()还是append()执行分配,这都是相同的逻辑。
在您的例子中,在仅使用var matrix [][]string之后,matrix[0]还不存在,因此您会收到index out of range错误。
例如,下面的代码将基于不同类型的现有切片的大小创建另一个切片:
func solve(board [][]rune, …) {

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

如果你只想根据已有的静态数组初始化切片,你可以直接这样做,甚至不需要使用append()或者make()

package main

import (
    "fmt"
)

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接