
Van de vertaler: vertaald . Dit artikel is nuttig voor zowel beginnende programmeurs als voor iedereen die geïnteresseerd is in Go.
Ik hou van Python. Deze taal was mijn favoriet de afgelopen vijf jaar. Het is vriendelijk, efficiënt en gemakkelijk te leren. Het wordt bijna overal voor gebruikt: van het maken van eenvoudige scripts en webontwikkeling tot datavisualisatie en machine learning.
De geleidelijke 'rijping' van Go, de uitgebreide community en het feit dat steeds meer bedrijven deze taal omarmen na succesvolle tests, hebben me ertoe aangezet om er aandacht aan te besteden en me in de literatuur te verdiepen. Maar deze post gaat niet over wat beter is - Python of Go: er zijn talloze vergelijkingen online. Naar mijn mening hangt alles af van het toepassingsgebied. Ik ga uitleggen waarom ik voor Go heb gekozen, met enkele tips en links naar nuttige bronnen voor iedereen die geïnteresseerd is in het onderwerp.
Skillbox raadt aan: Praktische cursus .
Ter herinnering: voor alle lezers van «Habr» — een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode «Habr».

Waarnemingen
Het eerste wat ik aan het begin van mijn reis deed, was de uitstekende officiële tutorial “”. Het geeft inzicht in de syntaxis van de taal.
Om mijn kennis te verbeteren, las ik ook het boek “”, dat me in staat stelde de volgende stap te zetten - proefondervindelijk leren.
Ik nam de vertrouwde functies die ik in Python gebruikte (JSON-serialisatie of werken met HTTP-aanroepen) en probeerde ze in Go te schrijven. Door deze duidelijke vergelijking kon ik de belangrijkste verschillen tussen de talen vaststellen.
Projectstructuur
Ten eerste vereist Python geen specifieke mappenhiërarchie, terwijl Go dat wel doet.
Go gebruikt een 'standaard' structuur die iets complexer is en meer werk vereist. Aan de andere kant krijgen we een goed gestructureerde codebasis, waarin een modulaire structuur wordt gebruikt en bij uitbreiding van het project de code goed georganiseerd blijft.
De officiële tutorial “” legt uit hoe je je werk kunt organiseren.
Statische strikte typering
Go is statisch getypeerd, en dat zal degenen die gewend zijn aan dynamisch getypeerde talen zoals Python en Ruby niet op hun gemak stellen.
Er is geen twijfel dat dynamische talen kwetsbaarder zijn voor fouten. De ontwikkelaar moet meer inspanningen doen om invoergegevens te controleren. Een voorbeeld is een functie die de som van twee gehele getallen berekent. Als je een string naar de functie verstuurt (wat niet zo zeldzaam is), leidt dit tot een TypeError.
In Go kan dit niet gebeuren, omdat je hier een type moet declareren voor elke variabele en functie en ook het type dat de functie zal retourneren.
Aanvankelijk is dit frustrerend: ik dacht dat deze eigenschap van Go de prestaties verlaagde - maar daarna kwam het besef dat het declareren van alles in feite tijd bespaart en de kans op fouten vermindert.
Natieve parallelisatie
Go heeft ingebouwde ondersteuning voor parallelisatie met behulp van goroutines en kanalen — dit is handig.
Het concept van kanalen lijkt in het begin een beetje verwarrend. Maar na verloop van tijd wordt het duidelijker en begin je te genieten van de nieuwe mogelijkheden door er actief mee te werken.
Hier is een visualisatie van alles wat gezegd is door .
package main
func main() {
// Maak een nieuw kanaal van type int
ch := make(chan int)
// Start een nieuwe anonieme goroutine
go func() {
// Verzend 42 naar het kanaal
ch <- 42
}()
// Lees van het kanaal
<-ch
} 
Meer voorbeelden en .
Werken met JSON
Nou, json.loads() is er niet meer. In Python is het eenvoudig: we gebruiken json.loads, en er zijn geen problemen.
Maar in Go, een statisch getypeerde taal, wordt deze operatie ingewikkelder.
Hier is alles vooraf gedefinieerd bij het gebruik van JSON. Elk veld dat niet in de gegeven structuur past, wordt genegeerd, en dat is goed. Dit kan worden gezien als een vooraf afgesproken protocol tussen twee partijen. De gegevens die je in JSON ontvangt, moeten verwacht worden, en de JSON-velden en -typen zijn 'overeen gekomen' door beide partijen.
{
"first": "Elad",
"last": "Leev",
"location":"IL",
"id": "93"
}type AccountData struct {
First string `json:"first"`
Last string `json:"last"`
Location string `json:"location"`
ID string `json:"id"`
}Natuurlijk kun je JSON deserialiseren zonder structuren, maar dit moet zoveel mogelijk vermeden worden, rekening houdend met de statische aard van de taal.
Het decoderen van JSON in GO kan het beste of .
Ben je lui om je JSON naar een Go-structuur te converteren? Geen probleem, .
Schone code
De Go-compiler zal altijd proberen je code ‘schoon’ te houden. Hij beschouwt ongebruikte variabelen als een compilatiefout. Go maakt gebruik van een unieke aanpak, waarmee het systeem de meeste formatteringsproblemen automatisch oplost. Zo zal Go het programma gofmt uitvoeren bij het opslaan of compileren en zelf de opmaak corrigeren.
Heb je geen interesse in variabelen? Geen probleem! Gebruik gewoon _ (onderstreping) en wijs het toe aan een lege identifier.
Een must-read tutorial voor deze sectie van de taal is de informatie uit “”.
Het vinden van de juiste bibliotheek en frameworks
Ik heb met Python gewerkt met frameworks en bibliotheken zoals Flask, Jinja2, Requests en zelfs Kazoo, dus ik was bang dat ik niets geschikts voor Go zou vinden.
Maar de community heeft deze problemen al opgelost: de taal heeft zijn eigen unieke bibliotheken die je volledig laten vergeten wat je eerder hebt gebruikt.
Dit zijn mijn favorieten.
Python Requests => net/http
biedt een handige en gebruiksvriendelijke implementatie van een HTTP-client en server.
Flask + Jinja2 => Gin
is een HTTP-webframework met een zeer eenvoudige API: parameters in de route, bestandsuploads, routegroepen (/ api / v1, / api / v2), aangepaste logformaten, statische bestanden bedienen, HTML-rendering en echt krachtige aangepaste middleware.
Beoordeel de benchmark.
CLI Creatie => Cobra
is een bibliotheek voor het creëren van krachtige CLI-toepassingen, evenals een programma voor het genereren van toepassingen en commandobestanden.
Cobra wordt gebruikt in veel grote Go-projecten, waaronder Kubernetes, etcd en OpenShift.
Hier zijn nog enkele bibliotheken die ik ten zeerste aanbeveel: , en deze geweldige lijst — .
Andere nuttige bronnen
[1] — je moet deze zeker bekijken en .
[2] .
[3] .
[4] , , — Twitter-accounts.
Laten we de balans opmaken
Na vijf jaar een constante gebruiker van Python te zijn geweest, was ik bang dat de overstap naar Go pijnlijk zou zijn.
Maar dat is niet het geval: er zijn veel van de community Go-bijdragen die de mogelijkheden van de taal uitbreiden en aanvullen, evenals verschillende nuttige bronnen die je zullen helpen bij de overstap.
Go ontwikkelt zich snel en ik hoop dat Google het kan maken tot de belangrijkste taal voor het schrijven van cloudtoepassingen en infrastructuur.
Doe mee!

Skillbox raadt aan:
- Praktische tweejarenopleiding .
- Online opleidingscursus .
- Praktische jaaropleiding .
Bron: habr.com
