Kätkendi versioon programmeerimiskeelest Go 1.18, mille arendust toetab Google koostöös kogukonnaga, pakub hübriidset lahendust, mis ühendab kompileeritud keelte kõrge jõudluse selliste skriptikeelte eelistega nagu lihtne koodi kirjutamine, kiire arendus ja vigade vältimine. Projekti kood on saadaval BSD litsentsi alusel.
Go süntaks põhineb tuttavatel elementidel C keelest, millel on eraldi laenud Python keelest. Keel on piisavalt lakooniline, kuid samas on kood kergesti loetav ja arusaadav. Go keeles kirjutatud kood kompileeritakse eraldi binaarseteks täidetavateks failideks, mis töötavad natiivselt ilma virtuaalmasina kasutamiseta (profiliseerimise, silumise ja muude probleemide tuvastamise alamsüsteemid integreeritakse runtime-komponentidena), mis võimaldab saavutada jõudluse, mis on võrreldav C keeles kirjutatud programmidega.
Projekt on algselt välja töötatud silmas pidades mitme lõime programmeerimist ja tõhusat töötamist mitme tuumaga süsteemides, pakkudes sealhulgas operaatorite tasemel rakendatud tööriistu paralleelsete arvutuste korraldamiseks ja paralleelselt töötavate meetodite vaheliseks suhtlemiseks. Keel pakub ka sisseehitatud kaitsevahendeid lubamatute mäluplokkide ületamise vastu ja võimaldab kasutusele võtta prügikoristajat.
Uues versioonis on lisatud tuge üldiste funktsioonide ja tüüpide (geneerikute) kasutamiseks, mis võimaldavad arendajal määratleda ja kasutada funktsioone, mida on mõeldud kohe mitmete tüüpidega töötamiseks. Samuti on antud võimalus kasutada liideseid, et luua kombineeritud tüüpe, mis hõlmavad mitut andmetüüpi. Geneerikute tugi on rakendatud ilma olemasoleva koodi tagurpidi ühilduvust rikkumata. // Arvude summimine, mis töötab tüüpide int64 ja float64 korral func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s } // Teine variant geneerilise tüübiga määratlemiseks: type Number interface { int64 | float64 } func SumNumbers[K comparable, V Number](m map[K]V) V { var s V for _, v := range m { s += v } return s }
Teised täiustused:
- Tavapärasesse tööriistade komplekti on integreeritud utiliidid koodi fuzzing-testimiseks. Fuzzing-testimise käigus genereeritakse voog igasugustest juhuslikest sisendandmete kombinatsioonidest ja fikseeritakse nende töötlemise käigus võimalikud tõrked. Kui mõni järjestus põhjustab käivituskatkestuse või ei vasta oodatud reaktsioonile, viitab see tõenäoliselt veale või haavatavusele.
- Lisatud on toetus mitmemoodulistele tööruumidele, mis võimaldavad käivitada käske korraga mitme mooduli jaoks, võimaldades samal ajal kokku koguda ja käivitada koodi mitmes moodulis.
- Suurepärane jõudlusoptimeerimine on tehtud Apple M1, ARM64 ja PowerPC64 protsessoritel põhinevatele süsteemidele. Sisendargumentide edastamiseks funktsioonidesse ja tulemuste tagastamiseks on lisatud võimalus kasutada registreid stacki asemel. Kompilaator on parandanud silteede sisseehitatud lahti keeramise, samas on kompilaatori tüüpide kontrolli täiesti ümber kujundatud. Teatud testide puhul on võrreldes eelmise väljaandega koodi jõudlus paranenud 20%, kuid ise kompileerimine võtab umbes 15% kauem aega.
- Runtime'is paranenud vabastatud mälu tagastamise tõhusus operatsioonisüsteemile ja prügikoguja töö on muutunud ennustatavamaks.
- Standardsesse teeki on lisatud uued paketid net/netip ja debug/buildinfo. Klientkoodis on vaikimisi välja lülitatud TLS 1.0 ja 1.1 toetus. Moodulis crypto/x509 on lõpetatud SHA-1 hash'iga allkirjastatud sertifikaatide töötlemine.
- Linuxi keskkonna nõuded on tõusnud; nüüd on vajalik vähemalt Linuxi tuuma versioon 2.6.32. Järgmises versioonis oodatakse sarnaseid muudatusi FreeBSD jaoks (FreeBSD 11.x haru toetus lõpetatakse) ja tööks on vajalik vähemalt FreeBSD 12.2.
Allikas: opennet.ru
