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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:55:57