Go语言传递二维切片遇类型不匹配,如何不限定大小传递?
解决Go中二维数组无法传递给[][]int参数的问题
嘿,这个问题我之前也踩过坑!你遇到的错误核心在于Go语言里固定大小的数组和切片是完全不同的类型——[][6]int是一个元素为固定长度6的数组的二维数组,而[][]int是元素为切片的二维切片,这俩类型压根不兼容,所以编译器直接报错了。
下面给你两种实用的解决方案,实现你想要的“不限定大小传递二维序列”的需求:
方案1:把现有二维数组转成二维切片传递
如果你已经用了固定大小的二维数组,可以手动把它转换成二维切片再传给函数:
package main import "fmt" // 接收不限大小的二维切片参数 func print2D(arr [][]int) { for _, row := range arr { fmt.Println(row) } } func main() { // 假设你原来的二维数组是这样定义的 var arr [3][6]int // 模拟从标准输入读取数据填充数组(这里用示例值代替) for i := 0; i < 3; i++ { for j := 0; j < 6; j++ { arr[i][j] = i*6 + j } } // 把二维数组转成二维切片 sliceArr := make([][]int, len(arr)) for idx := range arr { sliceArr[idx] = arr[idx][:] // 把每一行的固定数组转成切片 } // 现在就能正常传递给print2D了 print2D(sliceArr) }
方案2:一开始就用二维切片(更推荐)
如果不需要固定大小的数组约束,直接用二维切片来读取输入,这样就不用额外转换,函数参数天然支持“不限定大小”:
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func print2D(arr [][]int) { for _, row := range arr { fmt.Println(row) } } func main() { scanner := bufio.NewScanner(os.Stdin) var matrix [][]int fmt.Println("请输入矩阵(每行输入任意数量数字,空行结束输入):") for scanner.Scan() { line := scanner.Text() if line == "" { // 输入空行停止读取 break } // 拆分每行的数字 numStrs := strings.Fields(line) row := make([]int, len(numStrs)) for idx, s := range numStrs { num, _ := strconv.Atoi(s) row[idx] = num } // 把行添加到二维切片 matrix = append(matrix, row) } // 直接传递给函数,不管行数列数都能处理 print2D(matrix) }
再啰嗦两句为什么会报错
Go的数组是值类型,而且大小是类型的一部分——比如[6]int和[5]int是完全不同的类型,同理[][6]int(元素是[6]int)和[][]int(元素是[]int)也不属于同一类型系统。而切片是引用类型,它的长度和容量都是动态的,所以[][]int可以接受任意结构的二维切片,完美实现你想要的“不限定大小传递”的需求。
总结一下:如果要函数能处理任意大小的二维数据,参数就用[][]int,要么把现有数组转成切片,要么一开始就用切片存数据就行啦。
内容的提问来源于stack exchange,提问作者Anuruddha
相关产品推荐
相关产品推荐

