
本文详解 Go 中计算 n×n 方阵主对角线(i == j)与副对角线(i + j == n−1)元素和之差的完整实现,重点解决因二维切片未初始化导致的 index out of range panic 问题,并提供健壮、可运行的代码示例。
本文详解 go 中计算 n×n 方阵主对角线(i == j)与副对角线(i + j == n−1)元素和之差的完整实现,重点解决因二维切片未初始化导致的 `index out of range` panic 问题,并提供健壮、可运行的代码示例。
在 Go 中模拟二维数组需显式初始化内外两层切片。原代码中仅执行 s := make([][]int, n),这仅创建了一个长度为 n 的 nil 切片数组——每个 s[i] 默认为 nil,尚未分配内存,因此访问 s[i][j] 必然触发 panic: index out of range。
正确做法是:先为外层切片的每个元素单独分配内层数组。此外,输入逻辑也存在缺陷:fmt.Scanf("%d %d", &s[i][j]) 试图一次读取两个整数,但每行实际应输入 n 个数字(或逐个输入),且格式不匹配。推荐使用循环逐个读取,确保输入稳定性。
以下是修复后的完整可运行代码:
package main
import "fmt"
func main() {
var n int
fmt.Scan(&n)
// 创建 n×n 二维切片:先分配外层,再逐行初始化内层
s := make([][]int, n)
for i := 0; i <p><strong>关键要点总结:</strong> </p>
- ✅ make([][]int, n) 仅初始化外层切片,必须显式调用 make([]int, n) 初始化每一行;
- ✅ 输入应使用 fmt.Scan(&s[i][j]) 单次读取一个整数,避免 scanf 格式误匹配;
- ✅ 对角线遍历无需嵌套双循环:单层 for i := 0; i
- ⚠️ 注意副对角线索引为 s[i][n-1-i](非 s[i][n-i]),避免越界;
- ? 若需处理多组测试数据或从文件读取,建议封装为函数(如 diagonalDifference(matrix [][]int) int),提升复用性与可测性。
此方案兼顾安全性、效率与可读性,是 Go 中处理二维数值矩阵对角线运算的标准实践。











