go清除3字节字符

在 Go 中清除(删除)一个 3 字节字符(如中文、日文等多字节 UTF-8 字符),需要正确处理字符串的字节边界。

核心问题

Go 的string字节序列,不是字符序列。直接按索引删除字节会破坏 UTF-8 编码。

正确方法

方法 1:转换为 rune 切片(推荐)

go

package main import "fmt" func removeRune(s string, index int) string { runes := []rune(s) if index < 0 || index >= len(runes) { return s } return string(runes[:index]) + string(runes[index+1:]) } func main() { s := "你好世界" // 每个中文3字节,共12字节 fmt.Printf("原字符串: %q, 字节数: %d\n", s, len(s)) // 字节数: 12 // 删除第1个字符("你") result := removeRune(s, 0) fmt.Printf("删除后: %q, 字节数: %d\n", result, len(result)) // "好世界", 字节数: 9 }

方法 2:使用 UTF-8 包处理字节边界

go

package main import ( "fmt" "unicode/utf8" ) func removeRuneByByteIndex(s string, byteIndex int) string { if byteIndex < 0 || byteIndex >= len(s) { return s } // 找到该字节位置所在的 rune 起始位置 start := byteIndex for start > 0 && !utf8.RuneStart(s[start]) { start-- } // 获取该 rune 的宽度 _, width := utf8.DecodeRuneInString(s[start:]) return s[:start] + s[start+width:] } func main() { s := "你好世界" // 删除"你"(从字节0开始,宽3字节) result := removeRuneByByteIndex(s, 0) fmt.Printf("删除后: %q\n", result) // "好世界" // 删除"好"(从字节3开始,宽3字节) result2 := removeRuneByByteIndex(s, 3) fmt.Printf("删除后: %q\n", result2) // "你世界" }

方法 3:遍历删除特定字符

go

package main import "fmt" func removeChar(s string, target rune) string { result := make([]rune, 0, len([]rune(s))) for _, r := range s { if r != target { result = append(result, r) } } return string(result) } func main() { s := "你好世界好" result := removeChar(s, '好') // 删除所有"好" fmt.Printf("删除后: %q\n", result) // "你世界" }

关键要点

表格

要点说明
[]rune转换最直观,但有内存分配开销
utf8.DecodeRuneInString零分配,高效处理字节边界
切勿直接s[:3]+s[6:]可能切在 rune 中间,导致乱码
3字节字符中文、日文等常见 BMP 字符,Go 中rune值为0x800-0xFFFF

需要针对具体场景(按索引删除、按字符删除、高性能要求等)选择合适的方法