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
相关产品推荐
相关产品推荐

