#go #rnotes #release ⚡️⚡️⚡️ Вышел перенасыщенный новшествами go версии 1.18:
https://go.dev/doc/go1.18
Отмечу наиболее интересное:
• Дженерики 👽 Начало. Много отложено на 1.19
• К дженерикам прилагаются экспериментальные пакеты — аналоги стандартных, основанные на дженериках: x/exp/constraints , x/exp/slices и x/exp/maps
• В компиляторе исправлены давние косметические ошибки и некоторые программы, которые ранее компилировались, вдруг перестанут
• Изменения в garbage collector
• Новые оптимизации в компиляторе
• Оптимизация линковщика, уменьшающая размер бинарника
• Порт AMD64 умеет теперь выбирать разные наборы процессорных команд
• runtime/debug.ReadBuildInfo теперь содержит и информацию о системе контроля версий, которая была во время сборки
• Новый пакет net/ip. Поддерживает сравнение и может быть ключом
• В пакетах bytes и string новая функция Cut. Это упрощенная функция для выделения префикса и остатка
https://go.dev/doc/go1.18
Отмечу наиболее интересное:
• Дженерики 👽 Начало. Много отложено на 1.19
• К дженерикам прилагаются экспериментальные пакеты — аналоги стандартных, основанные на дженериках: x/exp/constraints , x/exp/slices и x/exp/maps
• В компиляторе исправлены давние косметические ошибки и некоторые программы, которые ранее компилировались, вдруг перестанут
• Изменения в garbage collector
• Новые оптимизации в компиляторе
• Оптимизация линковщика, уменьшающая размер бинарника
• Порт AMD64 умеет теперь выбирать разные наборы процессорных команд
• runtime/debug.ReadBuildInfo теперь содержит и информацию о системе контроля версий, которая была во время сборки
• Новый пакет net/ip. Поддерживает сравнение и может быть ключом
• В пакетах bytes и string новая функция Cut. Это упрощенная функция для выделения префикса и остатка
#go #rnotes #release Go версии 1.19 вышел конечно несколько недель назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.19
🤷♂️ В дженериках внезапно ничего нового не произошло
👍 Произошло знаковое событие — у Go наконец-то появилась описанная модель памяти. Что это? Это формализация поведения Go при конкурентной работе с переменными. Большинство статей про версию 1.19 делают акцент на этом и разбирают, что именно там внутри. Однако, в самом документе написано примерно следующее: «Если Вам необходимо прочитать этот документ — Вы слишком умный. Не будьте умным»
https://go.dev/ref/mem
📃 Go doc теперь умеет работать с простенькой разметкой. Т.е. можно делать заголовки, параграфы, внешние и внутренние ссылки, нумерованные и ненумерованные списки, и даже блоки кода. И
https://go.dev/doc/comment
• Новый тег сборки
https://go.dev/doc/gc-guide
‼️ Для новых горутин начальный размер стека теперь задается на основе статистики использования стека горутинами. Это к слову о пулах горутин
• На UNIX-системах RLIMIT_NOFILE теперь выставляется автоматом в максимально возможное значение при импорта пакета os
• Увеличена производительность конструкции
✅ В
‼️ В принципе много мелких, но чувствительных изменений в
• Результаты
• Любителям подуть щёки знанием алгоритмов сортировок — в
👍 В`time`
https://go.dev/doc/go1.19
🤷♂️ В дженериках внезапно ничего нового не произошло
👍 Произошло знаковое событие — у Go наконец-то появилась описанная модель памяти. Что это? Это формализация поведения Go при конкурентной работе с переменными. Большинство статей про версию 1.19 делают акцент на этом и разбирают, что именно там внутри. Однако, в самом документе написано примерно следующее: «Если Вам необходимо прочитать этот документ — Вы слишком умный. Не будьте умным»
https://go.dev/ref/mem
📃 Go doc теперь умеет работать с простенькой разметкой. Т.е. можно делать заголовки, параграфы, внешние и внутренние ссылки, нумерованные и ненумерованные списки, и даже блоки кода. И
go fmt
умеет это проверятьhttps://go.dev/doc/comment
• Новый тег сборки
//go:build unix
, включающая в себя aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, solaris
• Реализован soft memory limit — GC будет пытаться его соблюсти. Также теперь запускается несколько маленьких GC, вместо одного большогоhttps://go.dev/doc/gc-guide
‼️ Для новых горутин начальный размер стека теперь задается на основе статистики использования стека горутинами. Это к слову о пулах горутин
• На UNIX-системах RLIMIT_NOFILE теперь выставляется автоматом в максимально возможное значение при импорта пакета os
• Увеличена производительность конструкции
switch
за счет jump tables✅ В
sync/atomic
новые типы Bool, Int32, Int64, Uint32, Uint64, Uintptr, Pointer
. Причем Pointer
использует дженерики (первое использование в стандартной библиотеке), чтобы избежать конвертации в/из unsafe.Pointer
‼️ crypto/rand
теперь сам не буферирует чтение. Обратите на это внимание‼️ В принципе много мелких, но чувствительных изменений в
crypto/*
✅ Подарок всем, кто работает с разным IoT и бинарными данными. И fmt
, и encoding/binary
теперь оснащены функциями семейства Append*
. Например можно сделать fmt.Appendf(buf, "%s", "карамба")
или binary.BigEndian.AppendUint16(buf, modbusReg)
, прощай танцы вокруг bytes.Buffer
• flag
обзавелся функцией TextVar
упрощающий задание типизированных данных в строках, типа IP-адреса, времени и так далее• Результаты
io.NopCloser
и io.MultiReader
теперь реализуют метод WriteTo
• В net/http
теперь можно задаваемые пользователем коды 1xx в ResponseWriter.WriteHeader
✅ В net/http
появилась функция MaxBytesReader
, обратите на неё внимание, так как сильно упрощает жизнь• Любителям подуть щёки знанием алгоритмов сортировок — в
sort
он изменился👍 В`time`
Duration
теперь умеет Abs
. Очень полезно для проверки попадания в отрезок времени +-🔥4👍1
#go #rnotes #release Go версии 1.20 вышел конечно полтора месяца назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.20
🤷♂️ В дженериках внезапно ничего нового не произошло.
✅ Появилась конвертация из слайса в массив простым способом:
🤷♂️ Теперь интерфейсы могут удовлетворять ограничению
👉 У
🔥 Компилятор научился в магию оптимизации по профайлу (PGO). Создаёте профайл
• Новый пакет
❌ Появилась поддержка множественных ошибок. Внезапно можно вернуть несколько
👍 Экспериментальный, но интересный пакет
🍄 Пакет
🙀 Пакет
‼️ В пакете
🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"
—
🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
https://go.dev/doc/go1.20
🤷♂️ В дженериках внезапно ничего нового не произошло.
✅ Появилась конвертация из слайса в массив простым способом:
[4]byte(x)
. Создаётся копия. Зачем это надо? А например чтобы получить comparable
.🤷♂️ Теперь интерфейсы могут удовлетворять ограничению
comparable
. Живите теперь с этим. 👉 У
go build
появился ключ -cover
. Туда же пакет runtime/coverage
. Все это бурно пропустили в описаниях, а меня заинтересовало, потому что ничего не понял. Что-то про интеграционные тесты: https://go.dev/testing/coverage🔥 Компилятор научился в магию оптимизации по профайлу (PGO). Создаёте профайл
pprof
, подсовываете компилятору и или всё стало работать быстрее, или всё стало работать медленнее.• Новый пакет
crypto/ecdh
для обмена ключами Диффи-Хеллмана (я обращаю внимание на криптографию)❌ Появилась поддержка множественных ошибок. Внезапно можно вернуть несколько
%w
в fmt.Errorf
или сделать errors.Join(err, ... errN)
. Остановлюсь поподробнее. Считаю вредной штукой. Обработка ошибок в go
может и была странной, но была идиоматичной и вынуждала обработать таки ошибку. И чем раньше, тем лучше. Теперь появился инструмент "да я не знаю, что делать с ошибкой, потом подумаю". И потом сложный путь разбора. Все кейсы, которые я смог придумать с парной ошибкой, только запутывались таким решением. Пример из proposal вообще не выдерживает никакой критики. Давать отдельные ошибки на логин и пароль является антипаттерном. Ещё одной неприятностью является то, что множественные ошибки могут теперь создаваться из-за человеческой ошибки за счёт множественного %w
. Живите теперь с этим (c)👍 Экспериментальный, но интересный пакет
arena
про арены памяти. Хотел написать "не лезьте туда". Да лезьте, конечно. Просто ради интереса. Идея арены простая. Если у нас много мелких аллокаций, то можно взять сразу большой кусок памяти и делать это всё там. Принцип как в append
- взять с "запасиком".🍄 Пакет
http
предоставляет костыль http.ResponseController
. Смысл в том, что в func RequestHandler(w ResponseWriter, r *Request)
добавляется возможность немного поуправлять вот этим w
. Flush там сделать, или Timeout поменять. Если, конечно, изначальный тип содержит соответствующие методы. Да, у http.ResponseController
под капотом тайп свитчинг.🙀 Пакет
crypto/rsa
теперь использует новые алгоритмы с постоянным временем работы. Шифрование стало примерно в 20 раз дольше. Но всё ещё в пять раз быстрее дешифрования. Живите теперь с этим (c)‼️ В пакете
math/rand
внезапно seed делается сам при инициализации. Если вы ожидали повторяемости при запуске, то этого больше нет (хотя, в этом случае ты немного странный, друг). Привет, обратная совместимость! Функции Seed
и Read
стали устаревшими.🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"
—
🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
👍5❤1