You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言之旅切片练习代码运行报索引越界错误求解

问题分析

代码BUG原因

你的代码存在两个核心错误,直接触发索引越界报错:

  • 外层二维切片操作错误:初始化ans := make([][]uint8, dy)时,已经生成了长度为dy的二维切片,前dy个位置默认是nil的子切片。后续循环中你没有给这些位置赋值,反而用append(ans, slice)往切片末尾追加新元素,最终返回的ans长度是2dy,前dy个元素都是nil。pic.Show函数调用时会访问ans的前dy个元素,读取nil子切片的下标就会触发越界panic。
  • 内层子切片操作错误:初始化slice := make([]uint8, dx)时,已经生成了长度为dx的子切片,元素默认值都是0。后续循环中你没有给对应下标赋值,反而用append追加元素,最终每个子切片的长度变成2dx,不符合习题要求的长度为dx的规则。

修正后代码

package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
    ans := make([][]uint8, dy)
    for i:=0; i< dy; i++ {
        slice := make([]uint8, dx)
        for j := 0; j<dx;j++{
            // 直接给对应下标赋值,无需append
            slice[j] = uint8((i+j)/2)
        }
        // 直接给外层切片对应位置赋值,无需append
        ans[i] = slice
    }
    return ans
}

func main() {
    pic.Show(Pic)
}
习题设计相关解答

传入函数的设计是预期的。pic.Show函数的参数要求就是一个接收两个int参数、返回[][]uint8的函数,它内部会自己传入dx、dy的具体值,调用你传入的Pic函数生成图像数据,再渲染成图片展示,这是Go语言之旅练习的标准设计,不需要你自己调用Pic传参。

内容的提问来源于stack exchange,提问作者chain_of_dogs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:36:03