Go语言len()函数结果异常,字符串拼接触发索引越界问题求助
Go字符串交叉拼接问题的修复方案
问题现象
- 输入
s1="esame"、s2="go"时,输出为egsoa-m-,预期应为egsoa-m-e- - 调换输入顺序(
s1="go"、s2="esame")时,触发索引越界panic:panic: runtime error: index out of range [4] with length 4 goroutine 1 [running]: main.stamp(...) /home/Usr/Info/es19.go:16 main.main() /home/Usr/Info/es19.go:25 +0x2ac exit status 2
原问题代码:
package main import . "fmt" func stamp(s1 string, s2 string) (result string){ if len(s1) > len(s2) { for i := 0; i < (len(s1) - len(s2)); i++{ s2 += "-" } } else if len(s1) < len(s2) { for i := 0; i < (len(s2) - len(s1)); i++ { s1 += "-" } } for i := 0; i < len(s2); i++ { result += string(s1[i]) + string(s2[i]) } return } func main(){ var s1, s2 string Print("Insert 2 words: ") Scan(&s1, &s2) Println(stamp(s1,s2)) }
问题分析
核心问题是循环条件动态计算导致补全字符数量不足:
- 原代码中,
i < (len(s1)-len(s2))这类条件会在每次循环迭代时重新求值,而每次拼接'-'都会改变字符串长度,导致实际循环次数远小于预期的补全次数。 - 比如
s1="esame"(长度5)、s2="go"(长度2)时,初始差值为3,但第一次拼接后s2长度变为3,差值变为2;第二次拼接后s2长度变为4,差值变为1,循环直接终止,最终s2仅补了2个'-'(长度4),比s1短1位,导致交叉拼接时少了最后一组字符。 - 调换输入顺序后,
s1被补至长度4,而s2长度为5,交叉拼接循环到i=4时,s1[4]超出字符串长度,触发索引越界panic。
修复代码
package main import ( "fmt" "strings" ) func stamp(s1 string, s2 string) string { // 提前计算需要补全的字符数量,避免动态计算导致循环次数不足 diff := len(s1) - len(s2) if diff > 0 { // 给s2补diff个'-',用strings.Repeat更高效 s2 += strings.Repeat("-", diff) } else if diff < 0 { // 给s1补-diff个'-' s1 += strings.Repeat("-", -diff) } // 使用strings.Builder提升字符串拼接效率 var result strings.Builder // 循环次数取补全后的长度(两者已相等) for i := 0; i < len(s1); i++ { result.WriteByte(s1[i]) result.WriteByte(s2[i]) } return result.String() } func main() { var s1, s2 string fmt.Print("Insert 2 words: ") fmt.Scan(&s1, &s2) fmt.Println(stamp(s1, s2)) }
修复说明
- 提前计算补全数量:先计算两个字符串的长度差值并存储为变量
diff,确保补全次数固定,不会因字符串长度变化而改变。 - 使用strings.Repeat简化补全:替代循环拼接,代码更简洁且效率更高。
- 用strings.Builder优化拼接:Go中字符串是不可变类型,直接
+=拼接会频繁生成新字符串,strings.Builder可以减少内存分配,提升性能。 - 循环次数取补全后的长度:补全后
s1和s2长度相等,用len(s1)或len(s2)均可,避免因长度不一致引发索引问题。
测试验证:
- 输入
s1="esame"、s2="go":输出egsoa-m-e-,符合预期。 - 输入
s1="go"、s2="esame":输出geos-a-m-e,无panic,结果正确。
内容的提问来源于stack exchange,提问作者Cybot
相关产品推荐
相关产品推荐

