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
相关产品推荐
相关产品推荐

