如何将Go切片分割为固定长度子切片(最后一个可短于固定长度)
Go切片按固定长度分割的正确实现(避免越界)
你的代码触发越界错误的核心原因是循环条件i <= arr1_len会让最后一次循环的结束索引i+val超出原切片长度,同时当i等于原切片长度时,arr1[i:end]本身就是无效的切片操作。
以下是修正后的实现,确保每个子切片最多包含5个元素,最后一个子切片可少于5个:
package main import "fmt" func printRes(l []int) { fmt.Println(l) } func sliceTest() { arr1 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23} arr1Len := len(arr1) batchSize := 5 for i := 0; i < arr1Len; i += batchSize { // 计算当前子切片的结束索引,不超过原切片长度 end := i + batchSize if end > arr1Len { end = arr1Len } currentSlice := arr1[i:end] fmt.Println(i, end, currentSlice) printRes(currentSlice) } } func main() { sliceTest() }
关键修改点:
- 调整循环条件:将
i <= arr1_len改为i < arr1Len,确保循环只在i处于原切片的有效索引范围内时执行,避免i等于切片长度时的无效操作。 - 动态计算结束索引:每次计算
end时,判断是否超过原切片长度,若超出则用原切片长度作为结束索引,保证切片操作arr1[i:end]始终合法。
如果使用Go 1.21及以上版本,还可以用内置的min函数简化结束索引的计算:
end := min(i+batchSize, arr1Len)
内容的提问来源于stack exchange,提问作者rihekopo
相关产品推荐
相关产品推荐

