Kas iš viso yra tas Go?
Go (arba Golang, kaip dažnai vadinama internete, kad paieškos sistemoms būtų lengviau ją rasti) – tai programavimo kalba, kurią 2007 metais sukūrė Google inžinieriai Robert Griesemer, Rob Pike ir Ken Thompson. Oficialiai ji buvo pristatyta 2009-aisiais, o 2012-aisiais išleista pirmoji stabili versija. Kalba gimė iš nusivylimo – kūrėjai tiesiog pavargo nuo C++ kompiliavimo laikų, Java sudėtingumo ir Python lėtumo kritinėse sistemose.
Idėja buvo paprasta: sukurti kalbą, kuri kompiliuojasi greitai, veikia greitai, yra lengva skaityti ir rašyti, bei natūraliai palaiko lygiagretumą. Skamba kaip svajonė, tiesa? Ir iš dalies taip yra – Go tikrai daug ką daro gerai, nors turi ir savų keistenybių, kurios gali suerzinti.
Šiandien Go naudoja ne tik Google, bet ir Uber, Dropbox, Docker, Kubernetes, Cloudflare ir daugybė kitų kompanijų. Tai nėra hipsteriškas eksperimentas – tai gamybinė kalba, kuri jau seniai įrodė savo vertę.
Go architektūra ir tai, kas ją daro unikalia
Go yra statiškai tipizuota, kompiliuojama kalba su šiukšlių surinkėju (garbage collector). Tai reiškia, kad jūs gaunate kompiliuojamų kalbų greitį kartu su automatinio atminties valdymo patogumu. Kompromisas, žinoma, egzistuoja – GC periodiškai sustabdo programą, bet modernios Go versijos tai daro taip trumpai, kad daugumoje atvejų to net nepastebite.
Vienas iš svarbiausių Go bruožų – goroutines. Tai lengvos gijos, kurias Go runtime valdo pats, nepriklausomai nuo operacinės sistemos gijų. Vienas goroutine sunaudoja vos apie 2KB atminties paleidimo metu (lyginant su tipiniais 1-8MB OS gijoms). Tai reiškia, kad jūs galite paleisti šimtus tūkstančių goroutines vienu metu be jokių problemų.
Kartu su goroutines ateina channels – komunikacijos kanalai tarp goroutines. Go filosofija čia labai aiški: „Do not communicate by sharing memory; instead, share memory by communicating.” Tai fundamentaliai kitoks požiūris į lygiagretumą nei tradiciniai mutex’ai ir semaforai, nors Go palaiko ir juos.
Dar vienas įdomus sprendimas – Go neturi klasių ir paveldėjimo tradicine prasme. Vietoj to naudojamos struktūros (structs) ir interfeisai (interfaces). Interfeisai Go yra implicitiniai – jums nereikia rašyti „implements SomeInterface”, tiesiog įgyvendinate reikiamus metodus ir viskas. Tai labai lankstu ir sumažina kodą.
Kur Go tikrai šviečia
Kalbant atvirai, Go nėra universalus sprendimas viskam. Bet yra sričių, kur ji dominuoja taip natūraliai, kad sunku įsivaizduoti geresnį pasirinkimą.
Mikroservisai ir backend API – čia Go yra karalius. Greitas paleidimas, mažas atminties pėdsakas, puikus HTTP palaikymas standartinėje bibliotekoje (net be jokių išorinių framework’ų) ir natūralus lygiagretumas daro Go idealiu pasirinkimu. Jei kuriate REST API ar gRPC servisus, Go tiesiog veikia. Standartinė net/http biblioteka yra tokia gera, kad daugelis kompanijų ją naudoja tiesiogiai, be papildomų framework’ų.
Infrastruktūros įrankiai ir CLI programos – Docker, Kubernetes, Terraform, kubectl – visi parašyti Go. Tai nėra atsitiktinumas. Go kompiliuojasi į vieną statinį binarinį failą be jokių priklausomybių. Jums nereikia diegti runtime, JVM ar Python interpretatoriaus – tiesiog nukopijuojate failą ir jis veikia. Tai DevOps pasaulyje yra neįkainojama savybė.
Tinklo programavimas ir proxy serveriai – Cloudflare naudoja Go didelei daliai savo tinklo infrastruktūros. Nginx alternatyva Caddy parašyta Go. Kai jums reikia apdoroti tūkstančius vienalaikių tinklo jungčių, Go goroutines modelis yra tiesiog tobulas.
Duomenų apdorojimas ir ETL pipeline’ai – Go greitis ir efektyvumas daro jį puikiu pasirinkimu duomenų transformavimui ir apdorojimui. Ne tokiame masto kaip Spark, bet vidutinio dydžio duomenų apdorojimui – puikiai tinka.
Kur Go nėra geriausias pasirinkimas
Sąžiningumas čia svarbus. Go turi aiškių trūkumų ir sričių, kur kitos kalbos tiesiog lenkia ją.
Mašininis mokymasis ir duomenų mokslas – čia Python dominuoja ir greičiausiai dominuos dar ilgai. TensorFlow, PyTorch, scikit-learn, pandas – visa ekosistema sukurta Python. Go turi keletą bibliotekų ML srityje, bet jos toli gražu neprilygsta Python ekosistemei. Jei dirbate su ML, naudokite Python.
Sisteminė programuotė žemo lygio – Rust čia yra aiškus nugalėtojas. Jei jums reikia tikslaus atminties valdymo be GC pauzių, jei rašote OS branduolio modulius ar embedded sistemas – Go nėra tinkamas pasirinkimas. GC egzistavimas automatiškai pašalina Go iš daugelio realaus laiko sistemų.
Frontend ir mobiliosios aplikacijos – Go nėra skirtas šioms sritims. Yra eksperimentinių projektų (GopherJS kompiliuoja Go į JavaScript, WebAssembly palaikymas egzistuoja), bet tai nėra pagrindinė Go paskirtis. Naudokite tinkamas priemones tinkamoms užduotims.
Greitasis prototipavimas ir skriptai – Python ar Ruby čia lenkia Go. Go tipų sistema ir kompiliavimo žingsnis prideda trintį, kai tiesiog norite greitai kažką išbandyti. Nors Go kompiliuojasi labai greitai, vis tiek tai nėra tas pats kaip tiesiog paleisti Python skriptą.
Go mokymosi kreivė – kas laukia pradedančiojo
Gera žinia: Go yra viena paprasčiausių kalbų išmokti. Kalbos specifikacija yra trumpa – ją galite perskaityti per vieną dieną. Nėra šimtų skirtingų būdų padaryti tą patį dalyką. Nėra operatorių perkrovimo, nėra implicitinių konversijų, nėra magijos.
Bloga žinia: Go turi keletą konceptų, kurie gali suklaidinti ateinančius iš kitų kalbų.
Error handling – tai dažniausiai minimas Go keistumas. Vietoj išimčių (exceptions) Go naudoja daugiareikšmį grąžinimą ir klaidos reikšmę:
result, err := someFunction()
if err != nil {
// tvarkyti klaidą
return err
}
Tai veda prie to, kad jūsų kodas pilnas if err != nil patikrinimų. Kai kuriems tai atrodo verbališka ir erzinanti, kitiems – aiški ir ekspliciti. Go 2 versijoje planuojami pakeitimai šioje srityje, bet kol kas turite priprasti prie šio stiliaus.
Interfeisai ir kompozicija – jei ateinat iš Java ar C# pasaulio, Go interfeisų sistema iš pradžių gali atrodyti keistai. Nėra implements raktažodžio, nėra aiškios deklaracijos. Bet kai supranti šią sistemą, ji tampa labai galinga ir lanksti.
Goroutines ir channels – konceptualiai tai nėra sudėtinga, bet praktiškai rašyti teisingą lygiagretų kodą visada yra iššūkis. Race conditions egzistuoja ir Go, ir go race detector yra jūsų draugas.
Praktinis patarimas pradedantiesiems: pradėkite nuo oficialios Go Tour, tada perskaitykite „Effective Go” dokumentą. Parašykite paprastą HTTP serverį – tai geriausias būdas suprasti Go stipriąsias puses. Nenaudokite jokių framework’ų pirmąsias savaites – standartinė biblioteka yra turtinga ir mokymasis su ja duos gerą pagrindą.
Ekosistema, įrankiai ir bendruomenė
Go ekosistema yra brandžia ir gerai organizuota. Go modules sistema (įvesta 1.11 versijoje, tapusi standartu 1.16) išsprendė priklausomybių valdymo problemas, kurios kankino ankstesnes versijas. Šiandien priklausomybių valdymas Go yra paprastas ir patikimas.
Įrankių rinkinys yra išskirtinis:
gofmt– automatinis kodo formatavimas. Visi Go kodai atrodo vienodai. Nėra ginčų dėl skliaustų stiliaus ar tarpų – tiesiog paleidžiategofmtir viskas sutvarkyta.go vet– statinė analizė, randanti dažnas klaidasgo test– testavimo framework’as įmontuotas į kalbągo build– kompiliavimas, kuris tikrai greitasgopls– oficialus language server, puikiai veikia su VS Code, Neovim ir kitais redaktoriais
Bibliotekų ekosistema yra gera, nors ne tokia milžiniška kaip npm ar PyPI. Populiariausios bibliotekos:
- Gin arba Echo – greiti HTTP framework’ai, jei standartinės bibliotekos nepakanka
- GORM – ORM darbui su duomenų bazėmis
- Cobra – CLI aplikacijų kūrimui
- Zap arba logrus – struktūrizuotam logavimui
- testify – papildomos testavimo priemonės
Bendruomenė yra draugiška ir aktyvi. GopherCon konferencija vyksta kasmet, yra daugybė vietinių meetup’ų, o oficiali dokumentacija yra viena geriausių programavimo pasaulyje. Stack Overflow ir Reddit r/golang yra aktyvūs ir naudingi.
Realūs skaičiai – Go veikimas praktikoje
Teorija yra gražu, bet kalbėkime apie realius skaičius. Go veikimas paprastai patenka tarp C/C++ ir Java – greičiau nei Python ar Ruby dešimtimis kartų, šiek tiek lėčiau nei C dėl GC, bet labai arti Java veikimo su daug mažesniu atminties naudojimu.
Konkretus pavyzdys: paprastas Go HTTP serveris, apdorojantis statinius atsakymus, gali pasiekti šimtus tūkstančių užklausų per sekundę viename serveryje. Uber pranešė, kad perkėlus dalį sistemų į Go, atminties naudojimas sumažėjo 10 kartų lyginant su Node.js implementacija.
Go programos paleidimo laikas yra milisekundžių eilės – tai kritiškai svarbu serverless aplinkose ir CLI įrankiams. Java aplikacijos dažnai reikalauja kelių sekundžių „sušilti”, Go – ne.
Binarinių failų dydis gali būti minusas – paprasta Go programa gali sverti 5-15MB, nes visi reikalingi komponentai įkompiliuojami į failą. Bet tai yra kompromisas už nulį priklausomybių diegimo metu.
Praktinis patarimas: jei jūsų sistema turi apdoroti daug vienalaikių jungčių arba jums svarbus mažas atminties naudojimas – Go yra puikus pasirinkimas. Jei jūsų bottleneck yra duomenų bazės užklausos, kalba mažai ką pakeis.
Kada rinktis Go ir kaip tuo įsitikinti
Po viso šio aptarimo galima suformuluoti gana aiškius kriterijus. Go yra tinkamas pasirinkimas, kai:
- Kuriate backend servisus ar mikroservisus, kurie turi apdoroti daug vienalaikių užklausų
- Reikia CLI įrankio, kurį lengva platinti (vienas binarinis failas)
- Dirbate su tinklo programavimu, proxy ar duomenų srautais
- Komanda yra nedidelė ir svarbu, kad kodas būtų lengvai skaitomas ir prižiūrimas
- Reikia greito kompiliavimo ir paprastos CI/CD pipeline
Go nėra geriausias pasirinkimas, kai:
- Dirbate su ML/AI ir jums reikia Python ekosistemos
- Reikia tikslaus atminties valdymo be GC (naudokite Rust)
- Kuriate GUI aplikacijas (nors ir čia yra sprendimų, jie nėra brandūs)
- Jūsų komanda jau gerai moka kitą kalbą ir nėra aiškios priežasties keisti
Paskutinis, bet svarbus dalykas: Go yra kalba, kuri verčia jus rašyti aiškų, eksplicitinį kodą. Čia nėra magijos, nėra „clever” vienos eilutės sprendimų, kuriuos supranta tik autorius. Po šešių mėnesių grįžę prie savo Go kodo, jūs jį suprasite. Tai nėra smulkmena – tai yra viena svarbiausių savybių komercinėje programų kūrimo aplinkoje, kur komandos keičiasi, o kodas gyvena metus ir dešimtmečius. Ir galbūt būtent dėl to Go, nepaisant savo „nuobodumo” reputacijos, toliau auga ir tampa vis labiau paplitusi tarp kompanijų, kurioms svarbus ne tik veikimas, bet ir ilgalaikis kodo prižiūrimumas.






