Golang中如何将二维数组转换为二维切片

Golang中如何将二维数组转换为二维切片 你好,

我确信这个问题已经被问过无数次了,但我感觉自己一定漏掉了什么。 我尝试使用 writeAll,它期望一个二维字符串切片。 不幸的是,我的对象是一个二维数组。我尝试用 M[:][:] 将其转换为切片,但第二个维度仍然是数组: cannot use m[:][:] (type [][12]string) as type [][]string in argument to w.WriteAll

有什么语法糖可以让我尝试使其工作吗?我宁愿避免仅仅为了这个而构建一个切片。

示例:Go Playground - The Go Programming Language

谢谢!


更多关于Golang中如何将二维数组转换为二维切片的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

感谢您的回复,但这正是我想避免的。如果是一维数组,使用 [:] 就可以将其转换为切片,无需任何辅助函数。我想知道对于二维数组,是否有办法做到这一点,而不必显式地构建和填充一个二维切片。

更多关于Golang中如何将二维数组转换为二维切片的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我采用了创建一个二维切片的方法,类似于提议的解决方案,但没有复制值。

func arrayAsSlice(m *[8][12]string) [][]string {
	s := make([][]string, len(m))
	for r := 0; r < len(m); r++ {
		s[r] = m[r][:]
	}
	return s
}

Go Playground - The Go Programming Language

Go 是一种开源编程语言,它使得构建简单、可靠且高效的软件变得容易。

将你的数组转换为切片。例如

func array2Slice(m [8][12]string) [][]string {
    slice := make([][]string, len(m))
    for r := 0; r < len(m); r++ {
        cols := make([]string, len(m[r]))
        for c := 0; c < len(m[r]); c++ {
            cols[c] = m[r][c]
        }
        slice[r] = cols
    }
    return slice
}

在你的代码中使用时,只需

slice := array2Slice(m)
w := csv.NewWriter(os.Stdout)
w.WriteAll(slice)

要将二维数组转换为二维切片,需要手动进行转换,因为Go中数组和切片是不同的类型。二维数组[N][M]T无法直接转换为[][]T,因为内存布局不同。

以下是转换的示例代码:

package main

import (
    "encoding/csv"
    "fmt"
    "strings"
)

func main() {
    // 原始二维数组
    arr := [2][3]string{
        {"a", "b", "c"},
        {"d", "e", "f"},
    }
    
    // 转换为二维切片
    slice := make([][]string, len(arr))
    for i := range arr {
        slice[i] = arr[i][:]  // 将每行的数组转换为切片
    }
    
    // 使用csv.Writer
    var buf strings.Builder
    w := csv.NewWriter(&buf)
    w.WriteAll(slice)
    w.Flush()
    
    fmt.Println(buf.String())
    // 输出: a,b,c
    //       d,e,f
}

如果数组大小在编译时已知,也可以这样写:

func arrayToSlice(arr [2][3]string) [][]string {
    slice := make([][]string, len(arr))
    for i := range arr {
        slice[i] = arr[i][:]  // 关键:对每行进行切片转换
    }
    return slice
}

对于你的具体错误[][12]string,转换方法相同:

var m [5][12]string
slice := make([][]string, len(m))
for i := range m {
    slice[i] = m[i][:]  // 将[12]string转换为[]string
}

这样就能将w.WriteAll(slice)正确传递给csv.Writer

回到顶部