通八洲科技

Go 中切片操作 s[i:j] 的边界理解与常见错误修复

日期:2026-01-01 00:00 / 作者:碧海醫心

go 语言中切片语法 `s[i:j]` 表示从索引 `i` 到 `j-1` 的子串(左闭右开),而非从 `i` 开始取长度为 `j` 的片段;原代码误将 `encodedcode[i:4]` 理解为“取 4 个字符”,导致越界 panic。

在 Go 中,切片操作 s[i:j] 的语义是 包含起始索引 i,不包含结束索引 j,即提取 [i, j) 范围内的元素。因此:

正确做法是:以 i 为起点,取固定长度 4,即终点为 i + 4

parts := make([]string, 0, len(encodedCode)/4)
for i := 0; i < len(encodedCode); i += 4 {
    parts = append(parts, encodedCode[i:i+4]) // ✅ 正确:[i, i+4) → 恰好 4 个字节
}

⚠️ 注意事项:

总结:牢记 Go 切片语法 s[i:j] 是 左闭右开区间,j 是绝对结束索引,不是长度。混淆这一点是初学者最常遇到的运行时 panic 之一。建议熟读官方文档《Go Slices: Usage and Internals》夯实基础。