Путь Golang
407 subscribers
16 photos
2 files
37 links
Всё о Golang

Ресурсы и материалы: https://t.iss.one/waygolang/12

Кроме чата, Golang обсудить можно тут: https://t.iss.one/gogolang
Download Telegram
#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. Это упрощенная функция для выделения префикса и остатка
#go #rnotes #release Go версии 1.19 вышел конечно несколько недель назад, но я всё же хочу на него обратить внимание:
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

🤷‍♂️ В дженериках внезапно ничего нового не произошло.

Появилась конвертация из слайса в массив простым способом: [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 стали устаревшими.

🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"



🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
👍51