为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中按长度拆分字符串

在 Golang 中按长度拆分字符串

Go
慕工程0101907 2021-08-16 15:53:41
有谁知道如何在 Golang 中按长度拆分字符串?例如,在每 3 个字符后拆分“helloworld”,那么理想情况下它应该返回一个“hel”“low”“orl”“d”数组?或者,一种可能的解决方案是在每 3 个字符后附加一个换行符。非常感谢所有的想法!
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

这是另一个变体游乐场。与其他答案相比,它在速度和内存方面的效率要高得多。如果您想在这里运行基准测试,它们就是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。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 478 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信