Go 1.22 программалоо тилинин релизи сунушталды, ал Google тарабынан коомчулуктун катышуусу менен иштелип чыккан гибриддик чечим катары компиляцияланган тилдердин жогорку натыйжалуулугун скрипт тилдеринин код жазуунун жеңилдиги сыяктуу артыкчылыктары менен айкалыштырган. , иштеп чыгуу ылдамдыгы жана ката коргоо. Долбоордун коду BSD лицензиясы боюнча таратылат.
Go синтаксиси Оберон тилинен алынган кээ бир C тилинин тааныш элементтерине негизделген. Тили абдан кыска, бирок кодду окуу жана түшүнүү оңой. Go коду виртуалдык машинаны колдонбостон (профилдештирүү, мүчүлүштүктөрдү оңдоо модулдары жана башка иштөө убактысынын көйгөйлөрүн аныктоочу подсистемалары иштөө убактысынын компоненттери катары бириктирилген) жергиликтүү түрдө иштей турган өзүнчө экилик аткарылуучу файлдарга түзүлөт, бул C программаларына салыштырууга болот.
Долбоор алгач көп агымдуу программалоону жана көп ядролуу системаларда эффективдүү иштөөнү, анын ичинде параллелдүү эсептөөлөрдү жана параллелдүү аткарылуучу методдордун ортосундагы өз ара аракеттенүүнү уюштуруу үчүн оператор деңгээлиндеги каражаттарды камсыз кылуу менен иштелип чыккан. Тил ошондой эле ашыкча бөлүнгөн эстутум блокторуна каршы камтылган коргоону камсыз кылат жана таштанды жыйгычты колдонуу мүмкүнчүлүгүн берет.
Жаңы релиздеги өзгөрүүлөрдүн арасында:
- "for" циклдерине бүтүн сандардын диапазондорун аныктоо үчүн колдоо кошулду, мисалы, 0дөн 9га чейинки маанилерди кайталоо үчүн, эми "for i := диапазон 10 {...}" циклин колдоно аласыз.
- Кошулган эксперименталдык (GOEXPERIMENT=rangefunc) диапазон функциялары үчүн циклдер үчүн, бул функцияны итератор катары көрсөтүүгө мүмкүндүк берет. Мисалы, "for i, x := диапазон тилкелери. Артка(лар) {...}"
- Итерациялар боюнча цикл өзгөрмөлөрүн бөлүшүү үчүн coroutines (goroutines) чалууларды пайда кылган for циклдери менен көптөн бери чечилген көйгөй чечилди. Мисалы, код маанилери := []string{"a", "b", "c"} үчүн _, v := диапазонун маанилери { go func() { fmt.Println(v) аткарылды < - true }() } эми мурункудай эле "c" эмес, "a", "b" жана "c" чыгарат.
- Иштөө убагында эстутумду башкаруу оптималдаштырылды, бул көрсөткүчтүн 1-3% га жогорулашына жана көпчүлүк тиркемелерде эстутумдун керектелиши 1% га кыскарышына алып келди.
- Программаны аткарууда аныкталган өзгөчөлүктөрдү эске алууга мүмкүндүк берүүчү код профилин түзүүнүн (PGO - Profile-guided optimization) жыйынтыгы боюнча компиляторго оптималдаштырууну киргизүү боюнча иштер улантылды. Жаңы версияда компилятор ар кандай ыкмалардын кыйыр чалууларын кеңейтилген саптык блоктордун аткарылышы менен алмаштыруу үчүн девиртуалдаштыруу куралдарын колдонот.
- PGO иштетилгенде, кошумча өзгөртүү көпчүлүк программалардын иштешин 2-14% га жакшыртты.
- Маанилүү жана маанилүү эмес операцияларды бөлүү үчүн эвристиканы колдонуу менен компиляторго чалууларды киргизүү механизмин эксперименталдык (GOEXPERIMENT=newinliner) жакшыртылган ишке ашыруу кошулду.
- Стандарттык китепканага "math/rand/v2" пакети кошулду, ал бир кыйла комплекстүү API сунуштайт жана псевдо-кокус сандарды түзүү үчүн ылдамыраак алгоритмдерди колдонот.
- net/http.ServeMux пакети калыптардагы ыкмаларды жана маскаларды көрсөтүү мүмкүнчүлүгүн кошту, мисалы, "GET /static/{id}/" шаблону HTTP методу "GET" менен сурамдарга колдонулат жана " id" идентификаторундагы суралган жолдун экинчи сегментинин мааниси.
- Берилиштер базасы/sql пакети Null[T] түрү үчүн колдоону кошту, бул сизге NULL болушу мүмкүн болгон мамычаларды сканерлөөгө мүмкүндүк берет. Конкат функциясы ар кандай түрдөгү бир нече тилкелерди бириктирүү үчүн slices пакетине кошулду.
- Жумуш мейкиндиктери менен иштөө командаларында (модулдардын жыйнагы) жумушчу мейкиндиктин мазмунуна көз карандылыкты камтыган “вендор” каталогун колдонууга болот. Каталог “go work vendor” буйругун аткарууда түзүлөт жана “-mod=vendor” опциясы коюлганда куруу буйруктарында колдонулат (эгер сатуучунун каталогу бар болсо демейки боюнча иштетет).
Пайдалуу жүрүм-турумундагы өзгөрүүлөр.
- go get мындан ары эски GOPATH режиминде модулдан тышкары колдоого алынбайт (мис. GO111MODULE=өчүк менен). Go build and go test сыяктуу башка куруу буйруктары эски GOPATH программалары үчүн чексиз иштей берет.
- go mod init мындан ары башка сатуучунун куралдары үчүн (мисалы, Gopkg.lock) конфигурация файлдарынан модулдун талаптарын импорттоого аракет кылбайт.
- go test -cover азыр өзүнүн тест файлдары жок камтылган пакеттердин камтуу корутундуларын басып чыгарат. Go 1.22ге чейин, ушундай пакет үчүн тест-капкак отчетуна бармак беле? mymod/mypack [сыноо файлдары жок]
жана азыр Go 1.22 боюнча, пакеттеги функциялар ачык эмес деп эсептелет: mymod/mypack камтуу: билдирүүлөрдүн 0.0% Эскертүү: эгерде пакетте такыр аткарылуучу код жок болсо, биз камтуунун маанилүү пайызын билдире албайбыз; мындай топтомдор үчүн go test жетишпеген тест файлдарын билдирүүнү улантат.
- Жаңы трекерди колдоо, кээ бир көйгөйлөрдү оңдоо жана ар кандай барактардын окуу мүмкүнчүлүгүн жакшыртуу боюнча иштин алкагында байкоо куралынын веб-интерфейси бир аз жаңыртылды. Веб-интерфейс эми жиптин коопсуз көрүнүшүндө издерди изилдөөнү колдойт. Из көрүүчү азыр бардык тутум чалууларынын толук узактыгын көрсөтөт. Бул жакшыртуулар Go 1.22 же андан кийинки версияларында курулган программалар тарабынан жасалган издерди көрүү үчүн гана колдонулат. Келечектеги чыгарылыш Go'нун эски версиясында жасалган издерге бул жакшыртуулардын айрымдарын алып келет.
- Иштөө убактысы азыр типке негизделген таштанды чогултуу метаберилиштерин ар бир үймөк объектине жакыныраак сактайт. Бул өзгөртүү, ошондой эле ашыкча метаберилиштерди кайталоо аркылуу көпчүлүк Go программаларынын эс тутумунун ашыкча чыгымын болжол менен 1% азайтат. Кээ бир программаларда жакшыртуу азыраак болушу мүмкүн, анткени бул өзгөртүү эстутум бөлүштүргүчтүн өлчөмдөр классынын чектерин тууралайт, ошондуктан кээ бир объекттер чоңураак өлчөмдөгү класска жылдырылышы мүмкүн. Бул өзгөртүүнүн натыйжасы, мурда ар дайым 16 байттык чекке (же андан жогору) тегизделген кээ бир объекттердин даректери эми 8 байттык чекке тегизделет. Эстутум даректерин 8 байттан ашык тегиздөөнү талап кылган жана эстутумду бөлүштүргүчтүн мурунку тегиздөө жүрүм-турумуна таянган монтаждоо нускамаларын колдонгон кээ бир программалар иштебей калышы мүмкүн, бирок биз мындай программалар сейрек болот деп күтөбүз. Мындай программаларды GOEXPERIMENT=noallocheaders менен курууга болот жана эски метаберилиштер моделине кайтып келүү жана мурунку тегиздөө жүрүм-турумун калыбына келтирүү мүмкүнчүлүгү бар, бирок пакеттин ээлери тегиздөө божомолун болтурбоо үчүн монтаждык кодун жаңыртышы керек, анткени бул убактылуу чечим келечектеги чыгарылышта алынып салынат. .
- Go 1.20 релиз эскертүүлөрүндө айтылгандай, Go 1.22 азыр Go 1.20 же андан кийинки акыркы версиясын баштапкы куруу үчүн талап кылат. Биз Go 1.24 баштапкы куруу үчүн Go 1.22 же андан кийинки акыркы версиясын талап кылат деп күтөбүз.
Түпнуска (go.dev)
Source: linux.org.ru
