如何在GO中将任意大小的多维数组作为函数参数传递

时间:2019-03-20 22:12:19

标签: arrays go

我是GO的新手。这是我面临的问题。

该函数将任意大小的2D数组作为参数:

func PrintArray(a [][]string) {
    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s ", v2)
        }
        fmt.Printf("\n")
    }
}

如您所见,由于嵌套循环使用range。数组的大小真的没关系。

但是当我尝试调用此函数时:

a := [3][2]string{
    {"line", "tiger"},
    {"cat", "dog"},
    {"pigeon", "hamster"},
}
PrintArray(a[:])

它抱怨:

  

在PrintArray的参数中不能使用a [:](类型[] [2] string)作为类型[] [] string

但是,它也不会使用a[:][:]进行编译。

在GO lang中定义任意大小的多维数组的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

在Go中,array typesslice types是不同的。将切片传递到切片。

例如,

package main

import (
    "fmt"
)

func main() {
    a := [][]string{
        {"line", "tiger"},
        {"cat", "dog"},
        {"pigeon", "hamster"},
    }
    PrintSlices(a)
}

func PrintSlices(a [][]string) {
    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s ", v2)
        }
        fmt.Printf("\n")
    }
}

游乐场:https://play.golang.org/p/3mPDTIEUQmT

输出:

line tiger 
cat dog 
pigeon hamster

要分配矩阵:

package main

import (
    "fmt"
)

func NewMatrix(rows, cols int) [][]int {
    m := make([][]int, rows)
    for r := range m {
        m[r] = make([]int, cols)
    }
    return m
}

func main() {
    m := NewMatrix(3, 2)
    fmt.Println(m)
}

游乐场:https://play.golang.org/p/qvwQu2giRcP

输出:

[[0 0] [0 0] [0 0]]

答案 1 :(得分:1)

有趣的问题。这应该起作用

a := [][]string{
    {"line", "tiger"},
    {"cat", "dog"},
    {"pigeon", "hamster"},
}
PrintArray(a[:])

从错误消息中,我猜想使用size定义的数组属于不同类型。

例如,如果PrintArray如下所示:

func PrintArray(a [3][2]string) {

然后您可以将定义为以下内容的数组传递给它:

a := [3][2]string

如果我们通过PrintArray方法或a中的数字来改变数字,以至于它们不同,则会收到一条错误消息,内容为:

cannot use a (type [3][2]string) as type [3][1]string in argument to PrintArray