В Go строка на самом деле представляет собой просто последовательность байтов, а , индексируя строку, производит байты .Таким образом, вы можете просто разбить вашу строку на подстроки, разделив ее на подстроки размером 4 КБ.
Однако , так как символы UTF-8 могут занимать несколько байтов, есть вероятность, что вы разделитесь в середине последовательности символов.Это не проблема, если разделенные строки всегда будут снова объединяться в одном и том же порядке на другом конце перед декодированием, но если вы попытаетесь декодировать каждую по отдельности, вы можете получить недопустимые последовательности начальных или конечных байтов.Если вы хотите защититься от этого, вы можете использовать пакет 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
и обратно, поскольку, поскольку string
является неизменным, а []byte
- нет, данные должны быть скопированы в новую память при преобразовании, что занимает время O (n) (в обе стороны!), В то время как нарезка строкипросто возвращает новый заголовок строки, поддерживаемый тем же массивом, что и оригинал (с постоянным временем).