Golang运行时错误:索引超出范围(panic: runtime error index out of range)

Golang运行时错误:索引超出范围(panic: runtime error index out of range) 嗯,我正在学习Go语言

这里我创建了一个矩阵乘法程序,但出现了错误

panic

以下是代码

3 回复

你应该为矩阵分配内存。

更多关于Golang运行时错误:索引超出范围(panic: runtime error index out of range)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


类似:

MATA = make(int[][], R1)
fmt.Println("Enter Values For Matrix A \n\n")
for i := 0; i < R1; i++ {
   MATA[i] = make(int[], C1)
   for j := 0; j < C1; j++ {
      fmt.Print("Enter [", i+1, "][", j+1, "] Element:\t")
      fmt.Scanf("%d", &MATA[i][j])
    }
}

这是一个常见的运行时错误,通常发生在试图访问切片或数组中不存在的索引位置时。让我分析一下你的代码并提供一个修复方案。

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
}

错误通常发生在以下情况:

  1. 访问空切片的索引
  2. 索引值大于等于切片长度
  3. 矩阵维度不匹配导致越界访问

在你的原始代码中,问题可能出现在循环索引超出了矩阵的实际维度范围。使用上述修复后的代码可以避免这类运行时错误。

回到顶部