亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 520 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號