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

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

Dalla traduzione: tradotto per voi un articolo di Ilad Leeva sulla transizione da Python a Go. L'articolo sarà utile non solo ai programmatori principianti, ma a chiunque sia interessato a Go in un modo o nell'altro.

Mi piace Python. Questo linguaggio è stato il mio favorito per gli ultimi cinque anni. È amichevole, efficiente e facile da imparare. Viene utilizzato praticamente per tutto: dalla creazione di semplici script e sviluppo web alla visualizzazione dei dati e machine learning.

La crescente "maturazione" di Go, una comunità vasta e il fatto che sempre più aziende adottano questo linguaggio dopo test di successo, mi hanno spinto a prestargli attenzione e approfondire la letteratura. Ma questo post non riguarda quale sia migliore - Python o Go: ci sono un'infinità di confronti in rete. Secondo me, tutto dipende dal campo di applicazione. Voglio raccontarvi perché ho scelto Go, fornendo alcuni consigli e collegamenti a risorse utili per chi è interessato 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 un ottimo tutorial ufficiale “Tour Of Go”. Dà una comprensione della sintassi del linguaggio.

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

Ho preso funzioni familiari che usavo in Python (serializzazione JSON o lavoro con richieste 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

Prima di tutto, Python non richiede una gerarchia di cartelle specifica, mentre Go sì.

Go utilizza una struttura “standard” che è un po' più complessa e richiede più lavoro. D'altra parte, ciò ci fornisce una base di codice ben strutturata, dove viene utilizzata una struttura modulare e, man mano che il progetto si espande, il codice rimane rigorosamente ordinato.

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

Tipizzazione statica e rigida

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

Non ci sono dubbi che i linguaggi dinamici siano più soggetti a errori, richiedono maggiori sforzi da parte del programmatore per verificare i dati in ingresso. Un 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 verifica un errore di TypeError.

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

All'inizio è frustrante: pensavo che questa caratteristica di Go rallentasse il lavoro, ma poi ho capito che in realtà dichiarare tutto fa risparmiare tempo e riduce la probabilità di errore.

Parallellismo nativo

Go ha un supporto nativo per il parallellismo attraverso l'uso di goroutine e canali — è molto comodo.

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

Ecco una visualizzazione di quanto detto da Ivan Daniiluk.

package main

func main() {
    // crea un nuovo canale di tipo int
    ch := make(chan int)

    // avvia una nuova goroutine anonima
    go func() {
        // invia 42 al canale
        ch <- 42
    }()
    // legge dal canale
    <-ch
}

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

Altri esempi qui e qui.

Lavorare con JSON

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

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

Qui, quando si usa 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 preaccordato tra le due parti. I dati che si ricevono in JSON devono essere previsti, e i campi e i tipi JSON sono "concordati" 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 è consigliabile evitarlo quando possibile e tenere conto della natura statica del linguaggio.

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

Sei riluttante a convertire il tuo JSON in una 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 non utilizzate come errori di compilazione. Go utilizza un approccio unico che consente al sistema di risolvere la maggior parte dei problemi di formattazione. Infatti, Go eseguirà il programma gofmt al momento del salvataggio o della compilazione e correggerà automaticamente il formato.

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

Il materiale didattico principale per questa parte del lavoro con il linguaggio è l'informazione da “Effective Go”.

Cercare librerie e framework adatti

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

Ma la comunità ha già risolto questi problemi: il linguaggio ha le proprie librerie uniche che ti permettono di dimenticare completamente ciò che hai usato in precedenza.

Ecco i miei preferiti.

Python Requests => net/http

net/http fornisce un'implementazione dell'HTTP client e server semplice e facile da usare.

Flask + Jinja2 => Gin

Gin è un framework web HTTP con un API molto semplice: parametri nel percorso, file caricati, raggruppamenti di routing (/api/v1, /api/v2), formati di log personalizzati, gestione di file statici, rendering HTML e middleware davvero potente e personalizzabile.
Valuta il questo benchmark.

Creazione CLI => Cobra

Cobra è una libreria per creare potenti applicazioni CLI, nonché un programma per generare applicazioni e file di comando.
Cobra è utilizzata in molti grandi progetti Go, tra cui 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 Web Go.

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

Riepiloghiamo

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

Ma no: ci sono risorse della comunità Go che espandono e completano le capacità del linguaggio, oltre a vari utili strumenti che ti aiuteranno nella transizione.

Go si sta sviluppando rapidamente e spero che Google riesca a farlo diventare 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, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster