有谁知道如何按长度分割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 的一部分。

该索引将每个 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世'

10-08 13:46
查看更多