Amikor először hallottam a Go programozási nyelvről, a Google saját programozási nyelvéről, kíváncsivá tett. A 2007-ben tervezett és kiadott Go, más néven Golang, a 2010-es évek elején és közepén az új nyelvek – a Ruszt, a D, a Nim, a Scala, a Clojure – tömegébe tartozott, amelyek nagy port kavartak: Akkoriban úgy tűnt, hogy a programozók szívesen eltávolodnának a régebbi háttértárnyelvek (Java, C++) terjedelmes csomagjától, valamint a weben használt dinamikus nyelvek (PHP, Ruby, Python) számítási tehetetlenségétől és típusbizonytalanságától. Típusbiztonságot akartak, ami azt jelentette, hogy statikus tipizálást akartak. És gyorsaságot akartak.
Egyszerű volt történeteket találni olyan startupokról, mint például az IronMQ, amelyek a Rails hostolására használt több tucat szerverről néhány olyanra váltak, amelyet egy olyan nyelven lehetett hostolni, mint a Go. És mint valaki, aki akkoriban a PHP5-ben és annak minden problémájában elmélyült, az érdeklődők közé számítottam.
Amikor először találkoztam a Go nyelvvel, a régi munkám során, amikor CTO voltam az ActiveCampaignnél, kipróbáltam, hogy írok-e benne kódot. És nem tetszett. Problémákat okozott, valahányszor egy változót kihasználatlanul hagytam, vagy egy nem használt csomagot importáltam. A Go különösen szigorú volt a tipizálással kapcsolatban – ismertem a PHP típus-kényszerítését, de a C-t és a C++-t is ismertem, amelyek lehetővé tették az előjeles és előjel nélküli egész számok, valamint az egész számok méretének (16 bites, 32 bites, 64 bites) keverését.
A Go nem rendelkezett generikusokkal. Sőt, a nyelv egyik vezető nyelvtervezője (Rob Pike) meglehetősen élesen beszélt arról, hogy mi hiányzik a nyelvből. Ahogy Pike fogalmazott, ez jó dolog volt, és jót tett. A nyelvet a Google-nél dolgozó “átlagos” mérnököknek tervezték, már ha lehet őket annak nevezni. Bizonyos értelemben, amit akkoriban a Góról olvastál, azt lekicsinylőnek érezted. És a mai napig nem nehéz olyan embereket találni, akik továbbra is osztják ezt a kritikát.
Mi változtatta meg a véleményemet?
A Go egyszerű. Ebben különbözik a többi nyelvtől. Az egyszerűség erény, és minden bonyolultság, amit bevezetünk a nyelvbe, alaposan átgondolt.
Hosszú ideig – túl sokáig, ha megkérdezel néhány embert – a Go nem rendelkezett valódi csomagkezeléssel. Csak 2018-ban – több körös közösségi elköteleződés és egy nem hivatalos kísérleti csomagkezelő, a “dep” után – került a nyelvbe bármilyen hivatalos támogatás a megoldásukhoz (“modulok”).
De ebben az egyszerűségben rengeteg értéket találsz. Könnyen írhatsz néhány egysorost Rubyban, amelyek klassz dolgokat csinálnak, de ezekben az egysorosokban rengeteg varázslat rejtőzik: a szerény fejlesztőnek nehéz mindig felfognia a színfalak mögött zajló folyamatot. Lehet, hogy öt sornyi kód kell ugyanannak a dolognak a megírásához Go-ban, de te tudod, hogy az az öt sor mit csinál.
A Go az OOP egyik klasszikus fogalmát is elveszi: az öröklődést. Nem írhatsz egy alaposztályt Go-ban, és egy másik osztály nem örökölhet belőle. Valójában egyáltalán nincsenek “osztályok”.
Először óriási korlátozásnak tűnik, hogy a kód újrafelhasználásának és a kapszulázás egyik alapvető eszközét elveszik tőled. És természetes, hogy az első hajlamod a neheztelés érzése lesz.
De manapság gyakran nem használod az öröklést, még akkor sem, ha megtehetnéd. Interfészeket használsz, a viselkedésre és az absztrakciókra koncentrálsz – és ezt könnyen megteheted a Go-ban. Valójában ez minden, amit a Go-ban megtehetsz. Egy idő után az öröklés hiánya jó érzés, mert elkerülsz egy réteg technikai adósságot azáltal, hogy nem kell újra átnézned a kapcsolatok veszélyes fészkét, amelyet az örökléssel építettél fel. Talán Pike mégiscsak talált valamit.
Mára a Go meghatározott helyet vájt magának a nyelvi ökoszférában. Nem a C++-t próbálja helyettesíteni, ahogy azt egykor gondolták (és javasolták). Míg 10 évvel ezelőtt még úgy gondolta, hogy egy bizonyos projekthez Java-ra van szüksége, manapság talán jobban jár, ha a Go után nyúl.
Tanulandó nyelvekMérnöki vezetők vitatják meg a Ruby on Rails-t, a C#-t, a Pythont és a JavaScriptet
.