
Сочувствую.
Size: a a a
string sub = original.substring(from, to) + "";
, а при помощи нового варианта получить поведение, как в старом варианте, нельзя.Cap
(что, собственно говоря, и происходит в strings.Builder.String), но в общем случае это некорректная операция, потому что слайс мутабельный (всегда, иммутабельной версии слайса просто не существует), а строка — нет. Как результат, каст слайса байт в строку выделяет память в куче и копирует данные. Это лишняя работа, особенно если используемая строка почти сразу отбрасывается — например, если строка используется как ключ для map
. В какой-то момент в компилятор Go запилили peephole-оптимизацию, которая распознавала паттерн someMap[string(bytesSlice)]
и переписывала на реальный каст на фейковый, который просто копирует указатель и длину из слайса.const fn is_sorted(strings: &[&str]) -> bool
— благо после релиза Rust 1.46.0, разрешившим циклы в const fn, это весьма легко — и пишем отдельно константу const _ASSERT_IMPORTANT_ARRAY_IS_SORTED: [(); 1] = [(); is_sorted(&IMPORTANT_ARRAY) as _];
— и теперь программа не собирается из-за несоответствия типов, если массив не отсортирован. Проблема решена.