Go语言中如何检查rune有效性?反转字符串的错误处理方案
在Go语言中反转字符串并检测无效UTF-8字符
要在反转字符串时检测无效的UTF-8 rune并返回错误,你可以利用utf8.DecodeLastRuneInString的特性——当解码失败时,它会返回utf8.RuneError(值为\uFFFD)和宽度1。基于这个特性,修改你的函数如下:
修改后的Reverse函数
import ( "errors" "strings" "unicode/utf8" ) func Reverse(input string) (string, error) { builder := strings.Builder{} builder.Grow(len(input)) for i, w := len(input)-1, 0; i >= 0; i -= w { r, width := utf8.DecodeLastRuneInString(input[:i+1]) w = width // 检测解码出的是否为无效rune if r == utf8.RuneError { return "", errors.New("invalid UTF-8 sequence detected") } builder.WriteRune(r) } return builder.String(), nil }
关键说明
- 函数签名调整:将返回值从
string改为(string, error),确保遇到错误时能返回明确的错误信息。 - 无效rune判断:每次解码后检查返回的rune是否为
utf8.RuneError,若是则说明当前字节序列不是合法UTF-8字符,直接终止流程返回错误。 - 性能保留:原函数的内存预分配(
builder.Grow)逻辑不变,不会影响反转操作的效率。
测试示例
func main() { // 合法UTF-8字符串测试 s1 := "Hello, 世界" res1, err1 := Reverse(s1) if err1 != nil { panic(err1) } println(res1) // 输出:界世 ,olleH // 含无效UTF-8字节的字符串测试 s2 := "Hello, \xff世界" res2, err2 := Reverse(s2) if err2 != nil { println(err2.Error()) // 输出:invalid UTF-8 sequence detected } }
内容的提问来源于stack exchange,提问作者nikitakosatka
相关产品推荐
相关产品推荐

