Quanto è popolare la lingua Go? Paesi stranieri come Google, AWS, Cloudflare, CoreOS, ecc., e aziende nazionali come Qiniu e Alibaba hanno iniziato a utilizzare il linguaggio Go per sviluppare su larga scala i loro prodotti legati al cloud computing. A quali Sì e Ma dovrei prestare attenzione quando uso il linguaggio Go? Recentemente abbiamo scritto un'API usando il linguaggio Go, un linguaggio di programmazione open-source lanciato da Google nel 2009. Nel processo di utilizzo di Go per lo sviluppo, abbiamo acquisito molta esperienza e vogliamo condividerla con i lettori, quindi abbiamo questo articolo.
Quando si sceglie un linguaggio di programmazione per un progetto, consigliamo sempre di capire cosa costruirà il progetto prima di considerare su quale linguaggio di programmazione costruire. Lascia che il prodotto sia il fattore decisivo su come dovrebbe essere costruito.
Ecco alcuni pro e contro che abbiamo riscontrato sviluppando con Go per aiutarti a capire se è adatto al tuo prossimo progetto.
Cosa amiamo di Go
L'uso della lingua Go è esploso negli ultimi anni. Sembra che ogni startup lo usino per i sistemi backend. Ci sono molte ragioni per cui gli sviluppatori lo considerano così popolare.
La lingua Go è molto veloce
Go è un linguaggio di programmazione molto veloce. Poiché Go è compilato in codice macchina, supera naturalmente i linguaggi di programmazione interpretivi o con runtime virtuale. I programmi Go compilano anche molto rapidamente e producono binari molto piccoli. La nostra API si compila in pochi secondi, risultando in un file eseguibile di appena 11,5MB.
Facile da padroneggiare
La sintassi del linguaggio Go è semplice e facile da comprendere rispetto ad altri linguaggi. Puoi memorizzare la maggior parte della sintassi del Go nella tua testa, il che significa che non devi passare molto tempo a cercare le cose. Anche la lingua del Go è molto pulita e facile da leggere. I programmatori non-Go, specialmente quelli abituati alla sintassi in stile C, possono leggere il codice del programma Go e capire cosa sta succedendo.
Linguaggio di definizione di tipi statico
Go è un potente linguaggio statico che definisce i tipi. Ci sono tipi base come int, byte e string. Esistono anche tipi di strutture. Come in qualsiasi linguaggio fortemente tipizzato, il sistema di tipi permette al compilatore di aiutare a rilevare gli errori per l'intera classe. Il linguaggio Go ha anche tipi di lista e mappa integrati, e sono anche facili da usare.
Tipo di interfaccia
Il linguaggio Go ha tipi di interfaccia, e qualsiasi struttura può semplicemente soddisfare un'interfaccia implementando l'interfaccia. Questo ti permette di disaccoppiare le dipendenze nel tuo codice. Puoi poi simulare le tue dipendenze nei tuoi test. Utilizzando interfacce, puoi scrivere codice più modulare e testabile. Il linguaggio Go ha anche funzioni di prim'ordine, che rendono possibile agli sviluppatori scrivere codice in modo più pratico.
Biblioteca standard
Il linguaggio Go ha una libreria standard piuttosto buona. Fornisce funzioni integrate comode per gestire i tipi di base. Alcuni pacchetti rendono facile costruire un server web, gestire l'I/O, usare la crittografia e manipolare byte grezzi. La serializzazione e la deserializzazione JSON fornite dalla libreria standard sono molto semplici. Usando "tags", puoi specificare il nome del campo JSON accanto al campo struct.
Supporto ai test
Il supporto ai test è integrato nella libreria standard e non richiede dipendenze aggiuntive. Se hai un file chiamato thing.go, scrivi i test in un altro file chiamato thing_test.go e esegui "go test". Go eseguirà questi test rapidamente.
Strumenti di analisi statica
Gli strumenti di analisi statica per il linguaggio Go sono numerosi e potenti. Uno strumento in particolare è gofmt, che formatta il codice secondo lo stile suggerito da Go. Questo può normalizzare molte opinioni del progetto, permettendo al team award manager di concentrarsi sul lavoro svolto dal codice. Usiamo gofmt, golint e vet su ogni build, e se troviamo qualche avviso, la build fallisce.
Raccolta dei rifiuti
Quando si progettava il linguaggio Go, la gestione della memoria era stata intenzionalmente progettata per essere più semplice rispetto a C e C++. L'oggetto dell'allocazione dinamica è la raccolta dei rifiuti. Il linguaggio Go rende l'uso dei puntatori più sicuro perché non consente operazioni con il puntatore stesso. È inoltre offerta l'opzione di utilizzare i tipi di valore.
Modello di concorrenza più semplice
Sebbene la programmazione concorrente non sia mai facile, Go è più facile da programmare contemporaneamente rispetto ad altri linguaggi. Creare un thread leggero chiamato "goroutine" e comunicare con esso tramite "canale" è quasi un compito semplice, ma è possibile per modelli più complessi.
Quello che non ci piace di Go
Come abbiamo discusso prima, il Go è davvero una lingua eccellente. Ha una sintassi pulita ed è veloce da eseguire. Ha anche molti vantaggi. Ma l'intero linguaggio di programmazione non si riferisce solo alla sua sintassi. Ecco alcuni dei problemi che abbiamo incontrato.
Non esistono generici
Innanzitutto, questo problema, come un elefante in una stanza, è un fatto ovvio e trascurato. Non ci sono generici nella lingua Go. Per gli sviluppatori di linguaggi come Java, passare a Go è un ostacolo enorme da superare. Questo significa che il livello di riutilizzo del codice è ridotto. Sebbene il linguaggio Go abbia funzioni di prima classe, se scrivi funzioni come "mappa", "riduce" e "filter", progettate per operare su un solo tipo di raccolta, non puoi riutilizzare queste funzioni per altri tipi diversi di collezioni. Ci sono molti modi per risolvere questo problema, ma tutti finiscono per scrivere più codice, riducendo produttività e manutenibilità.
L'interfaccia è implicita
Anche se è bello avere interfacce, la struttura le implementa implicitamente piuttosto che esplicitamente. Si dice che questo sia uno dei punti di forza del linguaggio Go, ma abbiamo trovato difficile capire dalla struttura se implementasse o meno interfacce. Puoi davvero capire solo cercando di compilare il programma. Se il programma è piccolo, sicuramente non c'è nulla di male in questo. Ma se questo programma è su larga scala media-grande, il problema è grande.
Scarso supporto bibliotecario
Il supporto della biblioteca Go è disomogeneo. La nostra API si integra con Contentful, ma quest'ultimo non ha un Go SDK ufficialmente supportato. Questo significa che dobbiamo scrivere (e mantenere!) Molto codice da richiedere e analizzare i dati in Contentful. Dobbiamo anche affidarci alle librerie Elasticsearch di terze parti. Gli SDK Go forniti dai fornitori non sono popolari come i loro corrispettivi Java, Ruby o JavaScript.
La comunicazione nella comunità è difficile
La community di Go potrebbe non accettare suggerimenti. Considera questo nel repository GitHub di golint:Il login del link ipertestuale è visibile., un utente ha chiesto che Golint potesse fallire la build quando trovava un avviso (che è quello che facciamo nel progetto). I difensori hanno immediatamente respinto l'idea. Tuttavia, poiché troppe persone commentavano il problema, dopo un anno i manutentori dovettero finalmente aggiungere le funzionalità richieste.
Anche la community di Go sembra non gradire i framework web. Sebbene la libreria HTTP del linguaggio Go copra molti aspetti, non supporta parametri di percorso, controllo degli input e validazione, né preoccupazioni trasversali comuni nelle applicazioni web. Gli sviluppatori di Ruby hanno Rails, gli sviluppatori Java hanno Spring MVC, e quelli di Python hanno Django. Ma molti sviluppatori di Go scelgono di evitare di usare framework. Tuttavia, la realtà è che non esistono quadri di quadro, anzi, ce ne sono molti. Ma una volta che inizi a usare un framework per un progetto, è quasi impossibile evitare il destino dell'abbandono.
Gestione frammentata delle dipendenze
Per molto tempo, il linguaggio Go non ha avuto un gestore di pacchetti stabile e formale. Dopo anni di richieste dalla comunità, il progetto Go ha rilasciato godep solo di recente. Prima di allora, c'erano già molti strumenti per colmare questa lacuna. Usiamo un govendor molto potente nel nostro progetto, ma questo significa che la comunità è divisa, il che può essere molto confuso per gli sviluppatori che sono nuovi al linguaggio Go. Inoltre, quasi tutti i gestori di pacchetti sono alimentati da repository Git, e la storia dei repository Git può cambiare in qualsiasi momento. Confrontalo con Maven Central, che non elimina né modifica mai le librerie da cui dipende il tuo progetto.
Decidi se usare Go o meno
A volte bisogna pensare alla macchina. Quando invii e ricevi byte. Quando gestisci migliaia di processi concorrenti. Potresti anche scrivere un sistema operativo, un sistema container o un nodo blockchain. In questi casi, molto probabilmente non ti importeranno i generici. Perché sei impegnato a spremere le prestazioni per nanosecondo dal chip.
Tuttavia, molte volte bisogna pensare agli esseri umani. Dati dell'area di business con cui devi lavorare: clienti, dipendenti, prodotti, ordini. Devi scrivere la logica di business che opera su queste entità di dominio, e devi mantenere questa logica di business per molti anni. E deve gestire bisogni in evoluzione, e più velocemente è, meglio è. In questi casi, l'esperienza dello sviluppatore è importante.
Go è un linguaggio di programmazione che dà più valore al tempo macchina rispetto al tempo umano. A volte, nel tuo campo, le prestazioni di macchine o programmi sono le più critiche. In questi casi, Go può essere una buona alternativa a C o C++. Ma quando scrivi una tipica applicazione n-tier, spesso si formano colli di bottiglia nelle prestazioni nel database e, cosa più importante, nel modo in cui modellerai i dati.
Quando decidi se usare il linguaggio Go, considera le seguenti regole pratiche:
- Se hai a che fare con byte, allora il linguaggio Go potrebbe essere una buona scelta.
- Se hai a che fare con dati, allora il linguaggio Go potrebbe non essere una buona scelta.
Questo potrebbe cambiare un giorno in futuro. La lingua e la comunità Go sono ancora giovani. Potrebbero sorprenderci con l'aggiunta di generici; Oppure un framework web popolare vincerà alla grande. Tuttavia, per ora, resteremo con linguaggi di programmazione maturi con supporto universale, gestione delle dipendenze matura e un focus sulla modellazione dei domini aziendali.
|