有人知道如何在 Golang 中按长度分割字符串吗?
例如在每 3 个字符后拆分“helloworld”,所以理想情况下它应该返回一个由“hel”“low”“orl”“d”组成的数组?
另一种可能的解决方案是在每 3 个字符后添加一个换行符。
非常感谢所有想法!
最佳答案
确保 convert 你的string成一片 rune :见“Slice string into letters”。
for
自动将 string
转换为 rune
因此在这种情况下不需要额外的代码来转换 string
到 rune
首先。
for i, r := range s {
fmt.Printf("i%d r %c\n", i, r)
// every 3 i, do something
}
r[n:n+3]
最适合作为 rune slice 。
索引将在每个 rune 中增加 一个,而在 slice of string 中它可能每个字节增加一个以上 : "世界": i
将是 0 和 3:一个字符( rune )可以由多个字节组成。
例如,考虑 s := "世a界世bcd界efg世"
:12 个 rune 。 (见 play.golang.org )
如果您尝试逐字节解析它,您将错过(在每 3 个字符的天真分割实现中)一些“索引模 3”(等于 2、5、8 和 11),因为索引将超过这些值:
for i, r := range s {
res = res + string(r)
fmt.Printf("i %d r %c\n", i, r)
if i > 0 && (i+1)%3 == 0 {
fmt.Printf("=>(%d) '%v'\n", i, res)
res = ""
}
}
输出:
i 0 r 世
i 3 r a <== miss i==2
i 4 r 界
i 7 r 世 <== miss i==5
i 10 r b <== miss i==8
i 11 r c ===============> would print '世a界世bc', not exactly '3 chars'!
i 12 r d
i 13 r 界
i 16 r e <== miss i==14
i 17 r f ===============> would print 'd界ef'
i 18 r g
i 19 r 世 <== miss the rest of the string
但是,如果您要对 rune 进行迭代(a := []rune(s)
),您会得到您所期望的,因为索引会一次增加一个 rune ,使其很容易准确地聚合 3 个字符:
for i, r := range a {
res = res + string(r)
fmt.Printf("i%d r %c\n", i, r)
if i > 0 && (i+1)%3 == 0 {
fmt.Printf("=>(%d) '%v'\n", i, res)
res = ""
}
}
输出:
i 0 r 世
i 1 r a
i 2 r 界 ===============> would print '世a界'
i 3 r 世
i 4 r b
i 5 r c ===============> would print '世bc'
i 6 r d
i 7 r 界
i 8 r e ===============> would print 'd界e'
i 9 r f
i10 r g
i11 r 世 ===============> would print 'fg世'
关于string - 在 Golang 中按长度拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25686109/