Min rejse fra Python til Go - jeg deler rÄd og ressourcer

Min rejse fra Python til Go - jeg deler rÄd og ressourcer

Fra oversĂŠtteren: overfĂžrt for digt ha Ilya Leeva's article about transitioning from Python to Go. The article will be useful not only for beginner programmers but for anyone interested in Go in any way.

I like Python. This language has been my favorite for the last five years. It is friendly, efficient, and easy to learn. It is used for almost everything: from creating simple scripts and web development to data visualization and machine learning.

The gradual 'maturation' of Go, its extensive community, and the fact that more and more companies are adopting this language after successful trials made me pay attention to it and dive into the literature. But this post is not about which one is better — Python or Go: there are countless comparisons online. In my opinion, it all depends on the area of application. I intend to explain why I chose Go, offering some tips and links to useful resources for anyone interested in the topic.

Skillbox anbefaler: Praktisk kursus Python-udvikler fra bunden.

Vi minder om: til alle lĂŠsere af 'Habr' — rabat pĂ„ 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.

Min rejse fra Python til Go - jeg deler rÄd og ressourcer

Observations

The first thing I did at the beginning of my journey was to study the excellent official tutorial “Tour Of Go”. It provides an understanding of the syntax of the language.

To improve my knowledge, I also read the book “Go for Python Programmers”, which allowed me to move on to the next stage — trial and error.

I took familiar functions that I used in Python (JSON serialization or working with HTTP calls) and tried to write them in Go. This clear comparison allowed me to identify key differences between the languages.

Project Layout

First of all, Python does not require a specific directory hierarchy, while Go does.

Go uses a 'standard' layout, which is slightly more complex and requires more work. On the other hand, as a result, we get a well-structured code base that uses a modular structure, and when expanding the project, the code remains strictly organized.

The official tutorial “How to Write Go Code” explains how to organize your work.

Static Strong Typing

Go is statically typed, and this will make those used to dynamically typed languages like Python and Ruby feel out of place.

Der er ingen tvivl om, at dynamiske sprog er mere udsatte for fejl; udvikleren skal lĂŠgge mere arbejde i at validere input. Et eksempel er en funktion, der beregner summen af to heltal. Hvis der sendes en streng til funktionen (hvilket sker oftere, end man tror), vil det medfĂžre en TypeError.

I Go kan dette ikke ske, da man skal erklĂŠre typen for hver variabel og funktion samt hvilken type variabel funktionen vil returnere.

FÞrst er det irriterende: jeg troede, at denne egenskab ved Go gjorde det langsommere, - men sÄ indsÄ jeg, at deklarationen af alt faktisk sparer tid, og at sandsynligheden for fejl reduceres.

IndfĂždt parallelisme

Go har indbygget stĂžtte til parallelisme ved hjĂŠlp af goroutines og kanaler - det er praktisk.

Konceptet med kanaler virker til at begynde med lidt forvirrende. Men med tiden bliver det mere klart, og man begynder at nyde de nye muligheder ved aktivt at arbejde med dem.

Her er en visualisering af alt det, der er blevet sagt fra Ivan Danilyuk.

package main
 
func main() {
    // opret en ny kanal af typen int
    ch := make(chan int)
 
    // start en ny anonym goroutine
    go func() {
        // send 42 til kanalen
        ch <- 42
    }()
    // lĂŠs fra kanalen
    <-ch
}

Min rejse fra Python til Go - jeg deler rÄd og ressourcer

Flere eksempler her og her.

Arbejde med JSON

NĂ„, json.loads() er der ikke lĂŠngere. I Python er det enkelt: brug json.loads, og der er ikke problemer.

Men i Go, et statisk typet sprog, bliver denne operation mere kompliceret.

NÄr du bruger JSON i Go, er alt foruddefineret. Ethvert felt, der ikke passer ind i den givne struktur, vil blive ignoreret, og det er godt. Man kan tÊnke pÄ dette som en forudsigelig protokol mellem to parter. De data, du modtager i JSON, skal vÊre forventede, og felterne samt JSON-typerne er 'aftalt' mellem begge parter.

{
  "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"`
}

SelvfÞlgelig kan du deserialisere JSON uden strukturer, men dette bÞr undgÄs, nÄr det er muligt, og den statiske natur af sproget bÞr tages i betragtning.

Dekodning af JSON i GO forklares bedst i dette indlĂŠg eller her.

Er du doven til at konvertere din JSON til Go-struktur? Ingen problemer, det vĂŠrktĂžj klarer det hele for dig.

Rent kode

Go-kompilatoren vil altid forsÞge at holde din kode 'ren'. Den betragter ikke-brugte variabler som en kompilationsfejl. Go bruger en unik tilgang, som tillader systemet at lÞse de fleste formateringsproblemer. NÄr du gemmer eller kompilere, vil Go kÞre programmet gofmt og automatisk rette formateringen.

Er du ligeglad med variabler? Okay! Bare brug _ (underscore) og tildel den til en tom identifikator.

En must-read tutorial til denne del af arbejdet med sproget er information fra “Effective Go”.

SĂžgning efter egnede biblioteker og rammer

Jeg brugte rammer og biblioteker som Flask, Jinja2, Requests og endda Kazoo med Python, sÄ jeg var bange for, ikke at finde noget passende til Go.

Men fĂŠllesskabet har allerede lĂžst disse problemer: sproget har sine egne unikke biblioteker, som gĂžr, at du helt kan glemme det, du brugte tidligere.

Her er mine favoritter.

Python Requests => net/http

net/http tilbyder en praktisk og brugervenlig implementation af HTTP-klient og server.

Flask + Jinja2 => Gin

Gin er et HTTP-webframework med et meget simpelt API: parametre i stien, uploadede filer, gruppering af ruter (/ api / v1, / api / v2), brugerdefinerede logformat, betjening af statiske filer, rendering af HTML og virkelig kraftfuld brugerdefineret middleware.
Vurder denne benchmark.

CLI oprettelse => Cobra

Cobra er et bibliotek til oprettelse af kraftfulde CLI-ansĂžgninger, samt et vĂŠrktĂžj til at generere applikationer og kommandofiler.
Cobra anvendes i mange store Go-projekter, herunder Kubernetes, etcd og OpenShift.

Her er nogle flere biblioteker, som jeg varmt anbefaler: Viper, Gonfig og denne fantastiske liste — Awesome-Go.

Andre nyttige ressourcer

[1] Francesc Campoy  –  du skal bestemt tjekke disse Telegram-kanalen og GitHub-profil.

[2] GopherCon — videoer.

[3] Go Web-eksempler.

[4] Golang Weekly, Gopher Academy, Golang News — Twitter-konti.

Sammenfatning

Som en langvarig bruger af Python i fem Är, var jeg bange for, at overgangen til Go ville vÊre smertefuld.

Men nej: der er samfundsudviklinger i Go, der udvider og supplerer sprogets muligheder, samt forskellige nyttige ressourcer, som ogsÄ vil hjÊlpe dig med overgangen.

Go udvikler sig hurtigt, og jeg hÄber, at Google kan gÞre det til det primÊre sprog for udvikling af cloud-applikationer og infrastruktur.

Deltag!

Min rejse fra Python til Go - jeg deler rÄd og ressourcer

Skillbox anbefaler:

Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster