Il mio percorso da Python a Go — condivido consigli e risorse

Il mio percorso da Python a Go — condivido consigli e risorse

Dall'autore: sono state trasferite per voi l'articolo di Elad Leev sul passaggio da Python a Go. L'articolo sarà utile non solo ai programmatori principianti, ma anche a tutti coloro che comunque sono interessati a Go.

Mi piace Python. Questo linguaggio è stato il mio preferito negli ultimi cinque anni. È amichevole, efficace e facile da imparare. Viene utilizzato praticamente per tutto: dalla creazione di semplici script e dello sviluppo web, alla visualizzazione dei dati e all'apprendimento automatico

La 'maturazione' graduale di Go, la vasta comunità e il fatto che sempre più aziende adottano questo linguaggio dopo test di successo mi hanno spinto a prestare attenzione e approfondire la letteratura. Ma questo post non riguarda quale sia meglio - Python o Go: ci sono enormi quantità di confronti in rete. A mio parere, tutto dipende dall'ambito di applicazione. Intendo raccontare perché ho scelto Go, offrendo alcuni consigli e link a risorse utili per tutti coloro che sono interessati all'argomento.

Skillbox consiglia: Corso pratico Sviluppatore Python da zero.

Ricordiamo: per tutti i lettori di «Habr» — sconto di 10.000 rubli per l'iscrizione a qualsiasi corso Skillbox con il codice promozionale «Habr».

Il mio percorso da Python a Go — condivido consigli e risorse

Osservazioni

La prima cosa che ho fatto all'inizio del mio percorso è stata studiare l'ottimo tutorial ufficiale “Tour Of Go”. Esso offre una comprensione della sintassi del linguaggio.

Per migliorare le mie conoscenze, ho anche letto il libro “Go for Python Programmers”, che mi ha permesso di passare alla fase successiva - prove ed errori.

Ho preso funzioni familiari che utilizzavo in Python (serializzazione JSON o gestione di chiamate HTTP) e ho provato a scriverle in Go. Grazie a questo confronto visivo, sono riuscito a evidenziare le differenze chiave tra i linguaggi.

Struttura del progetto

Innanzitutto, Python non richiede una gerarchia di directory specifica, mentre Go sì.

Go utilizza una 'struttura standard' che è un po' più complessa e richiede più lavoro. D'altra parte, il risultato è una base di codice ben strutturata, dove viene utilizzata una struttura modulare, e quando il progetto si espande, il codice rimane ben ordinato.

Il tutorial ufficiale “How to Write Go Code” spiega come organizzare il proprio lavoro.

Tipizzazione statica rigorosa

Go è staticamente tipizzato, e questo farà sentire a disagio chi è abituato a linguaggi dinamicamente tipizzati come Python e Ruby.

Non ci sono dubbi che i linguaggi dinamici siano più suscettibili a errori, da parte dello sviluppatore ci vuole più sforzo per verificare i dati di input. Ad esempio, una funzione che calcola la somma di due numeri interi. Se si passa una stringa alla funzione (cosa che accade non così raramente), si avrà un errore TypeError.

In Go questo non può accadere, poiché qui è necessario dichiarare il tipo per ogni variabile e funzione e quale tipo di variabile la funzione restituirà.

Inizialmente questo può risultare fastidioso: pensavo che questa caratteristica di Go rallentasse il lavoro, ma poi è arrivata la comprensione che, in realtà, dichiarare tutto fa risparmiare tempo e riduce la probabilità di errori.

Parallelismo nativo

Go ha un supporto nativo per il parallelismo utilizzando goroutine e canali - il che è molto utile.

Il concetto di canali può sembrare un po' confuso all'inizio. Tuttavia, col passare del tempo, diventa più chiaro e si inizia a godere delle nuove possibilità lavorando attivamente con essi.

Ecco una visualizzazione di quanto detto da Ivan Danilyuk.

package main
 
func main() {
    // create new channel of type int
    ch := make(chan int)
 
// start new anonymous goroutine
    go func() {
        // send 42 to channel
        ch <- 42
    }()
    // read from channel
    <-ch
}

Il mio percorso da Python a Go — condivido consigli e risorse

Altri esempi qui e qui.

Lavorare con JSON

Beh, json.loads() non esiste più. In Python è semplice: usiamo json.loads e non ci sono problemi.

Ma in Go, un linguaggio staticamente tipizzato, quest'operazione diventa più complessa.

Qui, nell'uso di JSON, tutto è predefinito. Qualsiasi campo che non si adatta alla struttura definita verrà ignorato, e questo è positivo. Si può pensare a questo come a un protocollo pre-accordato tra due parti. I dati che si ottengono in JSON devono essere attesi, e i campi e i tipi JSON sono 'accordati' da entrambe le parti.

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

Certo, puoi deserializzare JSON senza strutture, ma per quanto possibile, sarebbe da evitare e tenere conto della natura statica del linguaggio.

La decodifica di JSON in GO è meglio spiegata in questo post o qui.

Sei pigro nel convertire il tuo JSON in struttura Go? Nessun problema, questo strumento farà tutto per te.

Codice pulito

Il compilatore Go cercherà sempre di mantenere il tuo codice 'pulito'. Considera le variabili inutilizzate un errore di compilazione. Go utilizza un approccio unico, consentendo al sistema di risolvere la maggior parte dei problemi di formattazione. Così, Go eseguirà il programma gofmt durante il salvataggio o la compilazione e correggerà automaticamente la formattazione.

Non ti interessano le variabili? Va bene! Usa semplicemente _ (underscore) e assegnalo a un identificatore vuoto.

Un tutorial imperdibile per questa parte del lavoro con il linguaggio è l'informazione da “Effective Go“.

Cercare una libreria e framework adatti

Ho utilizzato con Python framework e librerie come Flask, Jinja2, Requests e persino Kazoo, quindi temevo di non trovare nulla di adatto per Go.

Ma la community ha già risolto questi problemi: il linguaggio ha le proprie librerie uniche che permettono di dimenticare completamente ciò che si usava in precedenza.

Ecco i miei preferiti.

Python Requests => net/http

net/http fornisce un'implementazione della client e server HTTP facile da usare e conveniente.

Flask + Jinja2 => Gin

Gin è un framework web HTTP con un'API molto semplice: parametri nel percorso, file caricabili, routing di gruppi (/api/v1, /api/v2), formati di log personalizzati, servizio di file statici, rendering di HTML e un middleware personalizzato veramente potente.
Valuta questo il benchmark.

Creazione CLI => Cobra

Cobra è una libreria per creare potenti applicazioni CLI, così come un programma per generare applicazioni e file di comando.
Cobra è utilizzata in molti grandi progetti Go, inclusi Kubernetes, etcd e OpenShift.

Ecco altre librerie che ti consiglio vivamente: Viper, Gonfig e questa fantastica lista — Awesome-Go.

Altre risorse utili

[1] Francesc Campoy  — devi assolutamente dare un'occhiata a questi canale YouTube e profilo GitHub.

[2] GopherCon — video.

[3] Esempi di Go Web.

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

Tiriamo le somme

Essendo un utente abituale di Python per cinque anni, temevo che passare a Go sarebbe stato doloroso.

Ma no: ci sono risorse della community di Go che ampliano e completano le capacità del linguaggio, così come vari utili strumenti che ti aiuteranno nella transizione.

Go si sta sviluppando rapidamente e spero che Google possa farne il linguaggio principale per la scrittura di applicazioni e infrastrutture cloud.

Unisciti a noi!

Il mio percorso da Python a Go — condivido consigli e risorse

Skillbox consiglia:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster