Разделить строку на основе длины байта в Голанге - PullRequest
0 голосов
/ 14 сентября 2018

Заголовок запроса http имеет ограничение в 4 КБ.Я хочу разделить строку, которую я хочу включить в заголовок на основе этого ограничения.Должен ли я использовать []byte(str) для разделения сначала, а затем преобразовать обратно в строку, используя string([]byte) для каждой части разделения?Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 14 сентября 2018

В 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) (в обе стороны!), В то время как нарезка строкипросто возвращает новый заголовок строки, поддерживаемый тем же массивом, что и оригинал (с постоянным временем).

...