Sapo një version të ri të gjuhës së programimit Go 1.18, e cila zhvillohet nga kompania Google në bashkëpunim me komunitetin si një zgjidhje hibride, që kombinon performancën e lartë të gjuhëve të kompilueshme me avantazhet e gjuhëve të skritura si lehtësia në shkrimin e kodit, shpejtësia e zhvillimit dhe mbrojtja nga gabimet. Kodi i projektit shpërndahet nën licencën BSD.
Sintaksa e Go-së është e bazuar në elemente të njohura nga gjuha C me disa huazime nga gjuha Python. Gjuha është mjaft e përshtatshme, por gjithashtu kodi lexohet dhe kuptohet lehtësisht. Kodi në gjuhën Go kompilohet në skedarë ekzekutivë binarë të veçantë, të cilët ekzekutohen në mënyrë natyrale pa përdorimin e makinerive virtuale (modulet e profilizimit, debugging dhe nën-sistemet e tjera për zbulimin e problemeve integrohen si komponentë të runtime), gjë që lejon arritjen e performancës që është në nivelin e programeve në gjuhën C.
Projekti zhvillohet fillimisht me fokus në programimin me shumë procese dhe funksionimin efikas në sisteme me shumë bërthama, duke ofruar gjithashtu mjete të implementuara në nivelin e operatorëve për organizimin e llogaritjeve paralel dhe ndërveprimin ndërmjet metodave që ekzekutohen paralelisht. Gjuha gjithashtu ofron mjete të integruara mbrojtjeje nga dalja jashtë zonave të lejuara të blloqeve të alokuar të memorjes dhe siguron mundësinë e përdorimit të një mbledhësi të plehrave.
Në versionin e ri, është shtuar mbështetje për funksionet dhe llojet e përgjithshme (gjenerikë), me anë të të cilave zhvilluesi mund të përcaktojë dhe përdorë funksione të destinuara për të punuar me disa lloje në të njëjtën kohë. Po ashtu, është ofruar mundësia e përdorimit të interfecave për të krijuar lloje të kombinuara, të cilat përfshijnë disa lloje të të dhënave. Mbështetja e gjenerikëve është realizuar pa shkelur kompatibilitetin e prapaveprueshme me kodin ekzistues. // Grumbullimi i vlerave të një grupi, që funksionon për llojet int64 dhe float64 func SumIntsOrFloats[K krahasues, V int64 | float64](m map[K]V) V { var s V për _, v := range m { s += v } return s } // Një opsion tjetër me përcaktim të përgjithshëm të llojit: type Number interface { int64 | float64 } func SumNumbers[K krahasues, V Number](m map[K]V) V { var s V për _, v := range m { s += v } return s }
Përmirësime të tjera:
- Në mjetet e integruara ka utilitete për testimin e fuzzing të kodit. Gjatë testimit fuzzing, gjenerohet një rrjedhë e të gjitha llojeve të kombinimeve të rastësishme të të dhënave hyrëse dhe regjistrohen mundësitë e dështimeve gjatë përpunimit të tyre. Nëse një sekuencë e caktuar shkakton dështim ose nuk përputhet me reagimin e pritur, atëherë një sjellje e tillë me një probabilitet të lartë tregon për një gabim ose ndjeshmëri.
- E shtuar mbështetje për hapësira pune të shumë-moduleve, që lejon ekzekutimin e komandave menjëherë për disa module, çka mundëson mbledhjen dhe ekzekutimin e kodit në disa module në të njëjtën kohë.
- Kryer një optimizim të konsiderueshëm të performancës për sistemet e bazuara në procesorët Apple M1, ARM64 dhe PowerPC64. Aktivizuar mundësia e përdorimit të regjistrave në vend të stack-ut për kalimin e argumenteve në funksione dhe kthimin e rezultateve. Përsosur shpërndarja inline e cikleve nga kompileri. Kontrolli i tipeve në kompiler është rishikuar plotësisht. Në disa teste, në krahasim me versionin e kaluar, evidentohet një rritje e performancës së kodit prej 20%, por vetë kompilimi tani kryhet rreth 15% më ngadalë.
- Në runtime, është rritur efikasiteti i kthimit të memories së çliruar në sistemin operativ dhe është përmirësuar funksionimi i mbledhësit të plehrave, i cili tani është më i parashikueshëm.
- Biblioteka standarde ka shtuar paketa të reja net/netip dhe debug/buildinfo. Në kodin e klientit, mbështetja për TLS 1.0 dhe 1.1 është çaktivizuar si parazgjedhje. Në modulit crypto/x509 është ndërprerë përpunimi i certifikatave me nënshkrim bazuar në hash-in SHA-1.
- Kërkesat për mjedisin në Linux janë rritur; tani kërkohet nënshtresa e Linux-it të paktën versioni 2.6.32. Në lëshimin e ardhshëm priten ndrytime të ngjashme për FreeBSD (mbështetja për degën FreeBSD 11.x do të ndërpritet) dhe do të nevojitet të paktën FreeBSD 12.2 për funksionimin.
Burimi: opennet.ru
