När jag först hörde talas om Go, Googles eget programmeringsspråk, blev jag fascinerad. Go, även kallat Golang, utformades och släpptes 2007 och hörde till en skara nya språk – Rust, D, Nim, Scala, Clojure – som skapade stor uppståndelse i början och mitten av 2010-talet: Vid den här tiden verkade programmerare angelägna om att komma bort från det verbala bagaget från äldre backend-språk (Java, C++) samt den beräkningsmässiga ineffektiviteten och typosäkerheten hos dynamiska språk som används på webben (PHP, Ruby, Python). De ville ha typsäkerhet, vilket innebar att de ville ha statisk typning. Och de ville ha snabbhet.
Det var lätt att hitta historier om nystartade företag, som IronMQ, som gick från dussintals servrar som användes för att hysa Rails till ett par som kunde hysas i ett språk som Go. Och som en person som vid den här tiden var insatt i PHP5 och alla dess problem räknade jag mig själv till skaran av intresserade.
När jag först stötte på Go, i mitt gamla jobb som teknikchef på ActiveCampaign, försökte jag skriva lite kod i det. Och jag gillade det inte. Den gav mig problem när jag lämnade en variabel oanvänd eller importerade ett oanvänt paket. Go var särskilt strikt när det gällde typning – jag var bekant med PHP:s type coercion, men jag var också van vid C och C++, som lät dig blanda signerade och osignerade heltal, samt blanda heltalsstorlekar (16-bitar, 32-bitar, 64-bitar).
Go hade inga generiska egenskaper. Faktum är att en av dess huvudspråksutvecklare (Rob Pike) var ganska bestämd om vad språket saknade. Som Pike uttryckte det var detta en bra sak, och bra för dig. Språket utformades för de ”genomsnittliga” ingenjörerna som arbetade på Google, om man kan kalla dem det. På något sätt kändes det man läste om Go vid den tiden som en nedvärdering. Och än idag är det inte svårt att hitta människor som fortsätter att dela den kritiken.
Så vad fick mig att ändra mig?
Go är enkelt. Det skiljer sig från andra språk i det avseendet. Enkelhet är en dygd, och all komplexitet som man inför i språket övervägs noga.
Under lång tid – för lång tid, om man frågar någon – saknade Go någon riktig pakethantering. Det var först 2018 – efter flera omgångar av engagemang från samhället och en inofficiell experimentell pakethantering kallad ”dep” – som något officiellt stöd för deras lösning (”modules”) lades till i språket.
Men inom denna enkelhet finner man en hel del värde. Du kan lätt skriva några enliners i Ruby som gör coola saker, men gömd i dessa enliners finns en hel del magi: Det är svårt för den anspråkslöse utvecklaren att alltid förstå den process som pågår bakom kulisserna. Det kanske krävs fem rader kod för att skriva samma sak i Go, men du vet vad dessa fem rader gör.
Go tar också bort ett av de klassiska begreppen inom OOP: arv. Du kan inte skriva en basklass i Go och låta en annan klass ärva den. Faktum är att man inte har några ”klasser” alls.
I början känns det som en enorm begränsning att få ett av de grundläggande verktygen för återanvändning av kod och kapsling borttaget från dig. Och det är naturligt att din första benägenhet är en känsla av förbittring.
Men i dessa dagar använder du ofta inte arv, även om du skulle kunna göra det. Man använder gränssnitt, man fokuserar på beteende och abstraktioner – och detta kan man lätt göra i Go. Det är faktiskt allt du kan göra i Go. Efter ett tag känns avsaknaden av arv bra eftersom du undviker ett lager av teknisk skuld genom att inte behöva återbesöka det farliga boet av relationer som du hade byggt upp med hjälp av arv. Pike kanske hade rätt trots allt.
I dag har Go skapat sig en definierad plats i språkets ekosfär. Det försöker inte ersätta C++, som man en gång trodde (och föreslog). Även om du kanske trodde att du behövde Java för ett visst projekt för tio år sedan är det i dag kanske bättre att ta till Go.
Språk att lära sigIngenjörsledare diskuterar Ruby on Rails, C#, Python och JavaScript