在 Go 中,一个字符串实际上只是一个字节序列,索引一个字符串会产生 bytes。所以你可以简单地将你的字符串分割成 4kB 的子字符串。

unicode/utf8

package httputil


import "unicode/utf8"


const maxLen = 4096


func SplitHeader(longString string) []string {

    splits := []string{}


    var l, r int

    for l, r = 0, maxLen; r < len(longString); l, r = r, r+maxLen {

        for !utf8.RuneStart(longString[r]) {

            r--

        }

        splits = append(splits, longString[l:r])

    }

    splits = append(splits, longString[l:])

    return splits

}

直接切片字符串比[]byte来回转换更有效,因为 astring是不可变的而 a[]byte不是,数据必须在转换时复制到新内存,花费 O(n) 时间(双向!),而切片 a string 只是返回一个新的字符串头,由与原始数组相同的数组支持(花费常数时间)。