В Go 1.21, т.е. предыдущей стабильной версии, вызов slices.Delete[S ~[]E, E any](s S, i, j int) S
не обнулял значения удаленных элементов и они могли остаться в памяти. Если количество удаленных элементов
велико, а тем более, если это, например, указатели на большие объекты, то это могло привести к утечкам памяти.
В Go 1.21 дженерик-удаление - это однострочная функция.
Подлежащий массив слайса s
до удаления в Go 1.21:
0 | 1 | 2 | 3 | 4 |
Ниже подлежащий массив слайса после удаления в Go 1.21 slices.Delete(s, 1, 4)
.
Серым обозначены удаленные элементы слайса:
0 | 4 | 2 | 3 | 4 |
У команды разработчиков Go было и другое решение - предоставить пользователю самому обнулять ненужные элементы. Но это бы привело, по их мнению, к тому, что нужно постоянно помнить о том, что удаление способно привести к утечкам памяти. В итоге команда решила, что пусть уж лучше Go бережливо относится к памяти.
В Go 1.22 удаленные элементы в хвосте слайса обнуляются. То же самое касается функций пакета slices
:
Compact()
, CompactFunc()
и DeleteFunc()
.
По ссылке вы можете глянуть на сравнение производительности и стоимости развертывания PostgreSQL в облаках. Автор арендовал на время теста машины с 2vCPU, 8GB RAM и 100GB SSD и запустил pgbench на сутки. По итогу самым производительным оказался AWS, но одновременно и самым дорогим (USD141), а самым доступным Supabase (USD113; низкая цена судя по всему обеспечена ARM процессорами).
Немного про ARM процессоры: они более энергоэффективны, допускают высокую плотность размещения ядер без перегрева, а также ARM Holdings поощряет конкуренцию: любой желающий может по лицензии создавать свои процессоры на базе архитектуры ARM.
Версия go1.22.1 (выпущена 2024-03-05) включает в себя исправления безопасности для пакетов crypto/x509, html/template, net/http, net/http/cookiejar и net/mail, а также исправления ошибок для компилятора, команды go, среды выполнения, команды trace и пакетов go/types и net/http.