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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:03:36