在go语言里面优雅的反转字符串
在go语言里面优雅的反转字符串
一、用于反转ascii字符的方法
通常,说到反转字符串,由于string的不变性,就转为[]byte然后处理
-
func reverseBytes(s string) string {
-
r := []byte(s)
-
for i := 0; i < len(s); i {
-
r[i] = s[len(s)-1-i]
-
}
-
return string(r)
-
}
这种反转适用于 ascII的字符,因为byte底层为uint8,一字节,最多表示256种不同字符,如果使用此方法的字符串包含UTF-8的多字节表示的情况,将不能获得正确结果。
二、反转UTF-8的情况,需要使用rune
rune字符底层为uint32,4字节长度,适用于多字节编码的情况,此处处理UTF-8的情况
-
func reverseCodePoints(s string) string {
-
r := make([]rune, len(s))
-
start := len(s)
-
for _, c := range s {
-
// quietly skip invalid UTF-8
-
if c != utf8.RuneError {
-
start--
-
r[start] = c
-
}
-
}
-
return string(r[start:])
-
}
三、部分特殊字符,需要多字节段合并,才能正确读取并反转
对于这种特殊情况,需要特殊处理合并,下面展示一种。
-
func reversePreservingCombiningCharacters(s string) string {
-
if s == "" {
-
return ""
-
}
-
p := []rune(s)
-
r := make([]rune, len(p))
-
start := len(r)
-
for i := 0; i < len(p); {
-
// quietly skip invalid UTF-8
-
if p[i] == utf8.RuneError {
-
i
-
continue
-
}
-
j := i 1
-
for j < len(p) && (unicode.Is(unicode.Mn, p[j]) ||
-
unicode.Is(unicode.Me, p[j]) || unicode.Is(unicode.Mc, p[j])) {
-
j
-
}
-
for k := j - 1; k >= i; k-- {
-
start--
-
r[start] = p[k]
-
}
-
i = j
-
}
-
return string(r[start:])
测试代码
-
func main() {
-
test("asdf")
-
test("as⃝df̅中国")
-
}
-
-
func test(s string) {
-
fmt.Println("\noriginal: ", []byte(s), s)
-
r := reverseBytes(s)
-
fmt.Println("reversed bytes:", []byte(r), r)
-
fmt.Println("original code points:", []rune(s), s)
-
r = reverseCodePoints(s)
-
fmt.Println("reversed code points:", []rune(r), r)
-
r = reversePreservingCombiningCharacters(s)
-
fmt.Println("combining characters:", []rune(r), r)
-
}
-
//original: [97 115 100 102] asdf
-
//reversed bytes: [102 100 115 97] fdsa
-
//original code points: [97 115 100 102] asdf
-
//reversed code points: [102 100 115 97] fdsa
-
//combining characters: [102 100 115 97] fdsa
-
//
-
//original: [97 115 226 131 157 100 102 204 133 228 184 173 229 155 189] as⃝df̅中国
-
//reversed bytes: [189 155 229 173 184 228 133 204 102 100 157 131 226 115 97] ��學��fd���sa
-
//original code points: [97 115 8413 100 102 773 20013 22269] as⃝df̅中国
-
//reversed code points: [22269 20013 773 102 100 8413 115 97] 国中̅fd⃝sa
-
//combining characters: [22269 20013 102 773 100 115 8413 97] 国中f̅ds⃝a
参考文献:How to reverse a string in Go? - Stack Overflow
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfhjfb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01