Самый быстрый способ выделить большую строку в Go? - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно создать в Go строку длиной 1048577 символов (1 МБ + 1 байт).Содержание строки совершенно неважно.Есть ли способ выделить это напрямую без объединения или использования буферов?

Также стоит отметить, что значение строки не изменится.Это модульный тест для проверки того, что слишком длинные строки возвращают ошибку.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я закончил, используя это:

string(make([]byte, 1048577))

https://play.golang.org/p/afPukPc1Esr

0 голосов
/ 24 мая 2018

Используйте strings.Builder для выделения строки без использования дополнительных буферов.

var b strings.Builder
b.Grow(1048577)
for i := 0; i < 1048577; i++ {
  b.WriteByte(0)
}
s := b.String()

При вызове метода Grow выделяется срез с емкостью 1048577.Вызовы WriteByte заполняют часть до полной емкости.Метод String () использует unsafe для преобразования этого среза в строку.

Стоимость цикла можно уменьшить, записывая порции по N байтов за рази заполнение отдельных байтов в конце.

Если вы не против использования небезопасного пакета, используйте это:

p := make([]byte, 1048577)
s := *(*string)(unsafe.Pointer(&p))

Если вы спрашиваете, как это сделать с простейшим кодом, используйте следующее:

s := string(make([]byte, 1048577)

Этот подход не соответствует требованиям, изложенным в вопросе.Он использует дополнительный буфер вместо непосредственного размещения строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...