猿问

在 Golang 中按长度拆分字符串

有谁知道如何在 Golang 中按长度拆分字符串?

例如,在每 3 个字符后拆分“helloworld”,那么理想情况下它应该返回一个“hel”“low”“orl”“d”数组?

或者,一种可能的解决方案是在每 3 个字符后附加一个换行符。

非常感谢所有的想法!


慕工程0101907
浏览 479回答 3
3回答

扬帆大鱼

这是另一个变体游乐场。与其他答案相比,它在速度和内存方面的效率要高得多。如果您想在这里运行基准测试,它们就是benchmarks。一般来说,它比以前的版本快 5 倍,无论如何都是最快的答案。func Chunks(s string, chunkSize int) []string {    if len(s) == 0 {        return nil    }    if chunkSize >= len(s) {        return []string{s}    }    var chunks []string = make([]string, 0, (len(s)-1)/chunkSize+1)    currentLen := 0    currentStart := 0    for i := range s {        if currentLen == chunkSize {            chunks = append(chunks, s[currentStart:i])            currentLen = 0            currentStart = i        }        currentLen++    }    chunks = append(chunks, s[currentStart:])    return chunks}请注意,索引指向迭代字符串时符文的第一个字节。符文占用 1 到 4 个字节。切片还将字符串视为字节数组。以前的较慢算法代码在这里操场。从字节到符文再到字节的转换实际上需要很多时间。所以最好使用答案顶部的快速算法。func ChunksSlower(s string, chunkSize int) []string {    if chunkSize >= len(s) {        return []string{s}    }    var chunks []string    chunk := make([]rune, chunkSize)    len := 0    for _, r := range s {        chunk[len] = r        len++        if len == chunkSize {            chunks = append(chunks, string(chunk))            len = 0        }    }    if len > 0 {        chunks = append(chunks, string(chunk[:len]))    }    return chunks}请注意,这两种算法以不同的方式处理无效的 UTF-8 字符。当第二个用utf8.RuneError符号 ( '\uFFFD')替换它们时,第一个按原样处理它们,该符号在 UTF-8 中具有以下十六进制表示:efbfbd。
随时随地看视频慕课网APP

相关分类

Go
我要回答