如何获取一组数组(字符串)并在 Golang 中创建这些数组的多维切片?

How do I take a set of arrays (strings) and create a multidimensional slice of those arrays in Golang?

提问人:tosh-21 提问时间:2/9/2022 最后编辑:Willem D'Haeseleertosh-21 更新时间:2/9/2022 访问量:1832

问:

我正在尝试实现一个函数,当传递一个字符串数组时,它会创建一个数组切片,并将传递的每个数组添加到其中。它将返回传递的所有数组的最后一个切片。

作为测试,我初始化了 4 个数组,并尝试创建一个可以做到这一点的函数。然而,它失败得很惨。这就是我目前所拥有的。不知道该怎么做。

func main() {
    array1 := []string{"x", "o", "x", "_", "_"}
    array2 := []string{"0", "o", "x", "_", "_"}
    array3 := []string{"o", "o", "o", "_", "_"}
    array4 := []string{"o", "o", "o", "o", "o"}

    FinalSlice(array1)
    FinalSlice(array2)
    FinalSlice(array3)
    fmt.Println(FinalSlice(array4))

}

func FinalSlice(array []string) [][]string {
    var slice [][]string
    for i, _ := range slice {
        slice[i] = array
    }
    return slice

}

现在这是输出:

[]
变为 多维 组切片 数组

评论

1赞 mkopriva 2/9/2022
固定:go.dev/play/p/Oz9sk0kcjgm
3赞 mkopriva 2/9/2022
在代码中:循环覆盖在上一行中声明的空值。在空切片上循环得到正好 0 次迭代,即它与无循环相同。还在周围作用域内(即函数内部)声明切片,并且每当您调用时,您正在分配一个新切片,由先前调用分配的切片不再存在。for i, _ := range slice{slicevar slice [][]stringFinalSliceFinalSlice
0赞 tosh-21 2/9/2022
明白了,这更有意义。谢谢!

答:

2赞 KawaLo 2/9/2022 #1

这是因为你遍历了一个没有元素的空切片。

所以你的循环

for i, _ := range slice {}

实际上将运行 0 次迭代(这就是为什么你最终会得到一个空数组)。

我不明白你想要达到的确切结果,但如果你想将数组组合成一个多维数组,你可以使用下面的代码:

package main

import "fmt"

func AppendSlice(source [][]string, value []string) [][]string {
    return append(source, value)
}

func main() {
    array1 := []string{"x", "o", "x", "_", "_"}
    array2 := []string{"0", "o", "x", "_", "_"}
    array3 := []string{"o", "o", "o", "_", "_"}
    array4 := []string{"o", "o", "o", "o", "o"}

    var finalArray [][]string

    finalArray = AppendSlice(finalArray, array1)
    finalArray = AppendSlice(finalArray, array2)
    finalArray = AppendSlice(finalArray, array3)
    finalArray = AppendSlice(finalArray, array4)

    // [[x o x _ _] [0 o x _ _] [o o o _ _] [o o o o o]]
    fmt.Println(finalArray) 
}

这可以通过多种方式进行改进,请随时使用此解决方案:https://go.dev/play/p/vXvqlRZuOUI

评论

1赞 tosh-21 2/9/2022
是的,就是这样。将多个数组串联成一个多维切片。谢谢。
0赞 tosh-21 2/9/2022
您知道如何重新格式化数组,使其看起来像一个矩阵而不是并排的一行 X 数组吗?
1赞 KawaLo 2/9/2022
@tosh-21 逐行显示?您可以遍历数组并在不同的行上打印每一行for _, element := range finalArray { fmt.Println(element) }
1赞 Nicholas Carey 2/9/2022 #2

难道不能这样说吗?

func bundleSlices( slices ...[]int) [][]int {
    return slices
}

然后:

package main

import "fmt"

func main() {
    arr1 := []int{1, 2, 3}
    arr2 := []int{4, 5, 6}
    arr3 := []int{7, 8, 9}

    bundled := bundleSlices( arr1, arr2, arr3 )

    fmt.Println(bundled)

}

获取

[[1 2 3] [4 5 6] [7 8 9]]