
go中切片操作`str[i:j]`表示从索引i到j-1的子串,而非长度为j的子串;原代码误将`encodedcode[i:4]`理解为“取4个字符”,实际是固定取`[i, 3]`区间,导致越界。
在Go语言中,切片表达式 s[i:j] 的语义是 左闭右开区间:包含起始索引 i,但不包含结束索引 j,即实际截取的是 s[i], s[i+1], ..., s[j-1]。因此,s[i:j] 的长度为 j - i,而非 j。
原代码的问题在于:
parts = append(parts, encodedCode[i:4]) // ❌ 错误!第二个参数是结束索引,不是长度
这里 encodedCode[i:4] 表示从位置 i 到位置 3(含)的子串。当 i > 0 时(例如 i = 4),encodedCode[4:4] 是合法的(空字符串),但 encodedCode[8:4] 就直接 panic —— 因为 Go 要求 i 4 违反了 i slice bounds out of range。
✅ 正确写法应动态计算结束索引:
立即学习“go语言免费学习笔记(深入)”;
parts := make([]string, 0, len(encodedCode)/4)
for i := 0; i < len(encodedCode); i += 4 {
end := i + 4
if end > len(encodedCode) {
end = len(encodedCode) // 防御性处理(虽题设保证整除,仍建议保留)
}
parts = append(parts, encodedCode[i:end])
}更简洁且安全的版本(利用题设“长度恒为4的倍数”,可省略边界检查):
parts := make([]string, 0, len(encodedCode)/4)
for i := 0; i < len(encodedCode); i += 4 {
parts = append(parts, encodedCode[i:i+4]) // ✅ 正确:长度 = (i+4) - i = 4
}? 关键提醒:
- Go切片语法永远是 [start:end](索引值),不是 [start:length];
- 编译器不会推断“你想取4个字符”,必须显式写 i+4;
- 即使字符串长度严格满足 len % 4 == 0,i+4 也绝不能超过 len(encodedCode) —— 循环条件 i
建议深入阅读官方文档:Go Slices: Usage and Internals,彻底掌握切片底层机制与常见陷阱。










