В новом релизе, как и всегда, к нам приедут новые оптимизации для компилятора. Две из них меня заинтересовали больше всего:
• Цепочка из четырёх 1, 2, 3, 4 PR, суть которых можно описать с помощью одного примера:
var x []int
for i := 0; i < 4; i++ {
x = append(x, i)
}
Если в Go 1.24 и ранее такой код приводил к аллокации в хипе, то начиная с Go 1.25 — нет. А всё просто:
make и append теперь, в большинстве случаев, не аллоцируют память в хип до 32 байтов включительно. Вместо этого они используют память на стеке и лишь при превышении объёма начинают идти в хип. Такая вот консервативная оптимизация для слайсов всех типов.• Нулевые значения и "константные" переменные больше не аллоцируют память в хипе при присвоении значения интерфейсу. Продемонстрировать проще всего вот так:
type doubleInt struct{ value1, value2 int }
localVariable := doubleInt{value1: 3, value2: 2}
globalAny = any(localVariable)
localVariable2 := doubleInt{}
globalAny2 = any(localVariable2)
Если ранее подобный код приводил к аллокации, то теперь компилятор достаточно умён, чтобы на этапе компиляции выделить специальное read-only место в памяти и использовать именно его во время исполнения. Особенно приятно, что
reflect.Value.IsZero теперь использует сравнение по указателю для нулевых значений структур и массивов, что существенно удешевляет проверку.