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

Golang中对字符串使用负索引且不触发报错的解决方法

问题根因

Go 语言的字符串、切片索引语法不支持负数值,所有索引位置必须是大于等于0的整数。你代码里的报错是因为执行odd := s[i-max_len-1 : i+1]这行时,还未走到后续的i-max_len-1 >=0判断逻辑,当i初始为1、max_len初始为1时,计算出来的起始索引为1-1-1 = -1,直接触发了索引越界panic。

修复方案

调整代码执行顺序,先做索引合法性判断,再执行切片取值操作,不要提前取值。修改后的可运行代码如下:

func FindLongestPalindrom(s string) string {
    if len(s) == 1 || s == reverseString(s) {
        return s
    }
    max_len := 1
    start := 0
    for i := 1; i < len(s); i++ {
        // 先校验奇数长度回文的索引合法性,再取值
        if i-max_len-1 >= 0 {
            odd := s[i-max_len-1 : i+1]
            if odd == reverseString(odd) {
                start = i - max_len - 1
                max_len += 2
                continue
            }
        }
        // 再校验偶数长度回文的索引合法性,再取值
        if i-max_len >= 0 {
            even := s[i-max_len:i+1]
            if even == reverseString(even) {
                start = i - max_len
                max_len += 1
            }
        }
    }
    return s[start : start+max_len]
}

func reverseString(s string) string {
    runes := []rune(s)
    for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
        runes[from], runes[to] = runes[to], runes[from]
    }
    return string(runes)
}
Go实现负索引效果的通用方案

如果确实需要获取字符串/切片倒数位置的元素,手动计算正向索引即可:

  • 取倒数第n个字符:s[len(s) - n],需保证len(s) >=n避免越界
  • 取从倒数第n个位置到末尾的切片:s[len(s)-n:]

内容的提问来源于stack exchange,提问作者pl5020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:04