2026-01-31 06:53:23
make函数使用要点:
make([]T, length):创建长度和容量均为length的切片
make([]T, length, capacity):创建长度为length、容量为capacity的切片(capacity ≥ length)
关键区别:len决定可访问范围(0到len-1),cap决定扩容前最大容量
索引访问安全条件:
必须满足 0 ≤ index < len(slice)
违反条件会触发 panic: index out of range
外层切片初始化时指定长度为0:
make([][]uint8, 0, dy) 创建的切片长度为0
任何 pixels[y] 访问都会越界
内层切片未正确初始化:
即使外层修复,内层 make([]uint8, 0, dx) 仍会导致越界
外层切片初始化:
make([][]uint8, dy) 创建长度为dy的切片
包含dy个nil元素,允许通过0到dy-1索引访问
内层切片初始化:
每个 pixels[y] 单独初始化长度为dx的切片
确保内层索引0到dx-1有效
当尺寸不确定时,可采用append动态构建:
func DynamicPic(dx, dy int) [][]uint8 { var pixels [][]uint8 for y := 0; y < dy; y++ { row := make([]uint8, 0, dx) // 预分配容量 for x := 0; x < dx; x++ { row = append(row, uint8(x*y)) } pixels = append(pixels, row) } return pixels}3. 性能优化技巧nil切片:var s []T 或 make([]T, 0)
空但已初始化切片:make([]T, 0, capacity)
扩展至更高维度时,遵循相同的逐层初始化原则:
func Create3D(dx, dy, dz int) [][][]int { space := make([][][]int, dx) for x := range space { space[x] = make([][]int, dy) for y := range space[x] { space[x][y] = make([]int, dz) } } return space}make函数参数选择:
确定长度时使用make([]T, length)
预分配容量时使用make([]T, length, capacity)
二维切片初始化步骤:
先初始化外层切片的长度
循环初始化每个内层切片的长度
确保所有访问都在len范围内
错误处理原则:
预防优于检查:通过正确初始化避免错误
防御性编程:对不确定的输入添加边界检查
通过遵循这些原则和实践,可以完全避免Go语言中二维切片的索引越界问题,编写出健壮可靠的切片操作代码。