Как передать многомерный массив произвольного размера в качестве аргумента функции в GO - PullRequest
0 голосов
/ 21 марта 2019

Я новичок в GO. Есть проблема, с которой я сталкиваюсь.

Функция принимает в качестве аргумента двумерный массив произвольного размера:

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[:])

Жалуется на:

не может использовать [:] (строка типа [] [2]) в качестве строки типа [] [] в аргументе PrintArray

Однако он также не будет компилироваться с a[:][:].

Как правильно определить многомерный массив произвольного размера в GO lang?

Ответы [ 2 ]

2 голосов
/ 21 марта 2019

В Go типы массивов и типы срезов различны. Передайте ломтики ломтикам.

Например,

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 голос
/ 21 марта 2019

Интересный вопрос.Это должно работать

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

Из сообщений об ошибках я бы предположил, что массивы, определенные с размером, имеют разные типы.

Например, если 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...