
在 Go 中清除删除一个 3 字节字符如中文、日文等多字节 UTF-8 字符需要正确处理字符串的字节边界。核心问题Go 的string是字节序列不是字符序列。直接按索引删除字节会破坏 UTF-8 编码。正确方法方法 1转换为 rune 切片推荐gopackage 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[index1:]) } 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 包处理字节边界gopackage 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[startwidth:] } 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遍历删除特定字符gopackage 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需要针对具体场景按索引删除、按字符删除、高性能要求等选择合适的方法