Используйте 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)
Этот подход не соответствует требованиям, изложенным в вопросе.Он использует дополнительный буфер вместо непосредственного размещения строки.