Golang运行时错误:索引超出范围(panic: runtime error index out of range)
3 回复
这是一个常见的运行时错误,通常发生在试图访问切片或数组中不存在的索引位置时。让我分析一下你的代码并提供一个修复方案。
package main
import "fmt"
func main() {
// 原始有问题的代码示例
// matrixA := [][]int{{1, 2, 3}, {4, 5, 6}}
// matrixB := [][]int{{7, 8}, {9, 10}, {11, 12}}
// 修复后的矩阵乘法实现
matrixA := [][]int{{1, 2, 3}, {4, 5, 6}}
matrixB := [][]int{{7, 8}, {9, 10}, {11, 12}}
result := multiplyMatrices(matrixA, matrixB)
fmt.Println("矩阵乘法结果:")
for _, row := range result {
fmt.Println(row)
}
}
func multiplyMatrices(a, b [][]int) [][]int {
// 检查矩阵维度是否兼容
if len(a[0]) != len(b) {
panic("矩阵维度不兼容:A的列数必须等于B的行数")
}
// 创建结果矩阵
result := make([][]int, len(a))
for i := range result {
result[i] = make([]int, len(b[0]))
}
// 执行矩阵乘法
for i := 0; i < len(a); i++ {
for j := 0; j < len(b[0]); j++ {
sum := 0
for k := 0; k < len(b); k++ {
// 确保索引在有效范围内
if i < len(a) && k < len(a[i]) && k < len(b) && j < len(b[k]) {
sum += a[i][k] * b[k][j]
}
}
result[i][j] = sum
}
}
return result
}
更安全的实现方式,包含边界检查:
func safeMultiplyMatrices(a, b [][]int) [][]int {
// 验证输入矩阵
if len(a) == 0 || len(b) == 0 {
return [][]int{}
}
// 检查维度兼容性
colsA := len(a[0])
rowsB := len(b)
if colsA != rowsB {
panic(fmt.Sprintf("矩阵维度不兼容:A有%d列,B有%d行", colsA, rowsB))
}
// 验证所有行的长度一致
for i := 1; i < len(a); i++ {
if len(a[i]) != colsA {
panic("矩阵A的行长度不一致")
}
}
colsB := len(b[0])
for i := 1; i < len(b); i++ {
if len(b[i]) != colsB {
panic("矩阵B的行长度不一致")
}
}
// 创建并初始化结果矩阵
result := make([][]int, len(a))
for i := range result {
result[i] = make([]int, colsB)
}
// 执行矩阵乘法
for i := 0; i < len(a); i++ {
for j := 0; j < colsB; j++ {
for k := 0; k < colsA; k++ {
result[i][j] += a[i][k] * b[k][j]
}
}
}
return result
}
错误通常发生在以下情况:
- 访问空切片的索引
- 索引值大于等于切片长度
- 矩阵维度不匹配导致越界访问
在你的原始代码中,问题可能出现在循环索引超出了矩阵的实际维度范围。使用上述修复后的代码可以避免这类运行时错误。



