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

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))
}

修复说明

  1. 提前计算补全数量:先计算两个字符串的长度差值并存储为变量diff,确保补全次数固定,不会因字符串长度变化而改变。
  2. 使用strings.Repeat简化补全:替代循环拼接,代码更简洁且效率更高。
  3. 用strings.Builder优化拼接:Go中字符串是不可变类型,直接+=拼接会频繁生成新字符串,strings.Builder可以减少内存分配,提升性能。
  4. 循环次数取补全后的长度:补全后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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:15:37