我是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中定义任意大小的多维数组的正确方法是什么?
答案 0 :(得分:2)
在Go中,array types和slice 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