Go 1.19 пристигна с гръм и трясък, пет месеца след пускането на Go 1.18. Както очаквахме от екипа на Go, най-новата версия поддържа обещанието за съвместимост с Go 1, което означава, че можем да очакваме, че почти всички програми на Go ще продължат да се компилират и изпълняват както преди. По-голямата част от промените в тази версия се отнасят до внедряването на инструменталната верига, времето за изпълнение и библиотеките. Така че, нека разгледаме подробно тези актуализации.

Малка модификация на езика

Go 1.19 въвежда незначителна промяна в езика, която коригира обхвата на параметрите на типа в декларациите на метода. Не се притеснявайте, това ощипване няма да повлияе на съществуващите програми.

Модел на паметта

Моделът на паметта Go е преработен, за да се приведе в съответствие с моделите на памет, използвани от други основни езици като C, C++, Java, JavaScript, Rust и Swift. Go 1.19 предлага само последователно последователни атоми, избягвайки по-спокойните форми, открити в други езици. Заедно с актуализацията на модела на паметта бяха въведени нови типове в пакета `sync/atomic` за опростяване на използването на атомарни стойности, като `atomic.Int64` и `atomic.Pointer[T]`.

Портове

В тази версия Go разширява поддръжката на 64-битовата архитектура Loongson LoongArch на Linux, като минималната поддържана версия на ядрото е 5.19. Освен това портът `riscv64` вижда надстройка с поддръжка за предаване на аргументи на функцията и резултат с помощта на регистри, показвайки подобрения на производителността от 10% или повече.

Инструменти и команди

Изданието Go 1.19 предоставя подобрена поддръжка за връзки, списъци и по-ясни заглавия в коментарите на документи, заедно с въвеждането на ограничението за компилация „unix“. Като част от командата `go`, има няколко актуализации, включително промени в флага `-trimpath` и ускоряване на някои извиквания на `go list`. Програмата за проверка „veter“ „errorsas“ вече отбелязва често срещана грешка, когато „errors.As“ се извиква с втори аргумент от тип „*error“.

Време за изпълнение

Go 1.19 въвежда меко ограничение на паметта, което включва Go heap и цялата друга памет, управлявана от средата за изпълнение. Помага на програмите Go винаги да използват оптимално ограничението на паметта си, като подобрява ефективността на ресурсите. Все пак, имайте предвид, че малки ограничения на паметта, от порядъка на десетки мегабайта или по-малко, е по-малко вероятно да бъдат спазени поради външни фактори на латентност.

За да ограничи ефектите от разбиване на GC, когато размерът на живата купчина на програмата се доближи до лимита на меката памет, времето за изпълнение на Go също се опитва да ограничи общото използване на процесора на GC до 50%, с изключение на времето на неактивност. Очаква се това ограничение да играе роля само в изключителни случаи. Освен това, времето за изпълнение вече планира по-малко работни процедури на GC върху неактивни нишки на операционната система, когато приложението е достатъчно неактивно, за да принуди периодичен GC цикъл.

В допълнение, времето за изпълнение вече ще разпредели първоначалните стекове на goroutine въз основа на историческото средно използване на стека на goroutines. Тази промяна помага да се избегне част от ранното нарастване на стека и копирането, необходимо в средния случай.

Резюме

Go 1.19 обещава да предложи комбинация от подобрения в производителността и обогатени функции, които разработчиците очакваха с нетърпение. Докато продължаваме да изследваме и разбираме тези актуализации, е ясно, че екипът на Go остава ангажиран с подобряването на езика за разнообразен масив