12 pacchetti e librerie Go indispensabili

Go è un linguaggio straordinario con un sacco di slancio, ed è incentrato sulla semplicità. Questo approccio è evidente nella sua libreria standard, che fornisce tutti gli elementi essenziali, ma non molto di più. 

Fortunatamente, Go ha una vivace comunità che crea e condivide molte librerie di terze parti. In questo tutorial, ti presenterò 12 dei migliori pacchetti e librerie di Go. Alcuni di essi hanno uno scopo relativamente ristretto e possono essere aggiunti a qualsiasi progetto, mentre altri sono progetti enormi che è possibile incorporare in sistemi distribuiti di grandi dimensioni e su larga scala.

Fantastico Go

Prima di immergerti nelle librerie, lascia che ti presenti a Awesome Go, una lista molto attiva e curata di librerie di Go e altre risorse. Dovresti visitare ogni tanto e controllare le novità.

1. Set Golang

Go ha matrici, sezioni e mappe, ma non ha una struttura dati impostata. Puoi imitare un set con una mappa di bool, ma è bello avere un tipo di dati effettivo con le giuste operazioni e semantica. È qui che entra in gioco golan-set. Ecco un semplice esempio di creazione di un nuovo set, aggiunta di elementi e test per l'appartenenza:

pacchetto main import ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Aggiungi ("Verde") se basicColors.Contains ("Green") fmt.Println ("Yay! 'Green' è un colore di base") else fmt.Println ("Che delusione!" Green "non è un basic color ") if basicColors.Contains (" Yellow ") fmt.Println (" Yay! 'Yellow' è un colore di base ") else fmt.Println (" Che delusione! 'Yellow' non è una base colore ") Uscita: Sì! 'Verde' è un colore di base Che delusione! 'Giallo' non è un colore di base

Si noti che il nome del pacchetto è "mapset". Oltre alle basi, esegui tutte le operazioni impostate come unione, intersezione e differenza. Puoi anche scorrere i valori impostati: 

pacchetto main import ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Aggiungi ("Verde") otherColors: = mapset.NewSetFromSlice ([] interface  "Orange", "Yellow", "Indigo", "Violet") rainbowColors: = basicColors.Union (otherColors) per il colore: = range rainbowColors.Iterator (). C fmt.Println (color)

2. Colore

Continuiamo con il tema del colore. Durante la scrittura di programmi da riga di comando, è utile utilizzare i colori per evidenziare messaggi importanti o distinguere tra errori, successi e avvisi. 

Il pacchetto colori offre un modo semplice per aggiungere un po 'di colore ai tuoi programmi (vedi cosa ho fatto lì?). Usa i codici di escape ANSII e supporta anche Windows! Ecco un rapido esempio:

pacchetto main import ("github.com/fatih/color") func main () color.Red ("Roses are red") color.Blue ("Violets are blue") 

Il pacchetto di colori supporta la miscelazione di colori con colori di sfondo, stili come grassetto o corsivo e spruzza il colore con output non colorato.

pacchetto main import ("github.com/fatih/color" "fmt") func main () minion: = color.New (color.FgBlack) .Add (color.BgYellow) .Add (color.Bold) minion.Println ("Minion dice: banana !!!!!!") m: = minion.PrintlnFunc () m ("Voglio un'altra banana !!!!!") slantedRed: = color.New (color.FgRed, color.BgWhite , color.Italic) .SprintFunc () fmt.Println ("I've made a huge", slantedRed ("errore")) 

Il pacchetto colori ha altre utili funzionalità. Vai avanti ed esplora di più.

3. Ora

Ora è un pacchetto molto semplice che fornisce un wrapper di convenienza per il pacchetto orario standard e semplifica il lavoro con vari costrutti di data e ora intorno all'orario corrente. 

Ad esempio, è possibile ottenere l'inizio del minuto corrente o la fine della domenica più vicina all'ora corrente. Ecco come usare "now":

pacchetto main import ("github.com/jinzhu/now" "fmt") func main () fmt.Println ("Tutti gli inizi ...") fmt.Println (now.BeginningOfMinute ()) fmt.Println (now.BeginningOfHour ()) fmt.Println (now.BeginningOfDay ()) fmt.Println (now.BeginningOfWeek ()) fmt.Println (now.BeginningOfMonth ()) fmt.Println (now.BeginningOfQuarter ()) fmt.Println (now.BeginningOfYear ()) Output: Tutti gli inizi ... 2017-06-04 16:59:00 -0700 PDT 2017-06-04 16:00:00 -0700 PDT 2017-06-04 00:00:00 -0700 PDT 2017 -06-04 00:00:00 -0700 PDT 2017-06-01 00:00:00 -0700 PDT 2017-04-01 00:00:00 -0700 PDT 2016-12-31 23:00:00 -0800 PST 

È anche possibile analizzare i tempi e persino aggiungere i propri formati (che richiedono l'aggiornamento dei formati noti). Il Adesso digitare incorpora time.time, quindi puoi usare tutto il time.time metodi direttamente Adesso oggetti.

4. Gen

Lo strumento gen genera codice per te, in particolare, codice sensibile al tipo che tenta di alleviare il vuoto di non avere modelli o generici in Go.

Annoti i tuoi tipi con un commento speciale e gen genera i file sorgente che includi nel tuo progetto. Nessuna magia di runtime. Vediamo un esempio. Ecco un tipo annotato.

// + gen slice: "Where, Count, GroupBy [int]" type Persona struct Name string Age int 

In esecuzione gen (assicurati che sia nel tuo percorso) genera person_slice.go:

// Generato da: gen // TypeWriter: slice // Direttiva: + gen on Person package main // PersonSlice è una porzione di tipo Person. Usalo dove useresti [] Person. digita PersonSlice [] Person // Dove restituisce un nuovo PersonSlice i cui elementi restituiscono true per func. Vedi: http://clipperhouse.github.io/gen/#Where func (rcv PersonSlice) Dove (fn func (Person) bool) (risultato PersonSlice) per _, v: = range rcv if fn (v)  result = append (result, v) return result // Count fornisce gli elementi numerici di PersonSlice che restituiscono true per la funzione passata. Vedi: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Conteggio (fn func (Persona) bool) (risultato int) per _, v: = intervallo rcv if fn (v)  result ++ return // GroupByInt raggruppa elementi in una mappa digitata da int. Vedi: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt (fn func (Person) int) map [int] PersonSlice result: = make (map [int] PersonSlice) per _, v: = range rcv key: = fn (v) result [chiave] = append (risultato [chiave], v) risultato restituito 

Il codice fornisce metodi simili a LINQ per operare su PersonSlice genere. È semplice da capire e ben documentato. 

Ecco come lo usi. Nella funzione principale, a PersonSlice è definito. Il età() la funzione seleziona il campo dell'età dal suo Persona discussione. Il generato GroupByInt () la funzione prende il età() funzione e restituisce le persone dalla fetta raggruppata per la loro età (34 è solo Jim, ma 23 ha sia Jane che Kyle).

pacchetto main import ("fmt") // + gen slice: "Dove, Count, GroupBy [int]" type Persona struct Nome stringa Age int func age (p Person) int return p.Age func main () people: = PersonSlice "Jim", 34, "Jane", 23, "Kyle", 23, groupedByAge: = people.GroupByInt (age) fmt.Println (groupedByAge) Output: mappa [34: [Jim 34] 23: [Jane 23 Kyle 23]]

5. Gorm

Go è noto per la sua natura spartana. La programmazione del database non è diversa. Le librerie DB più popolari per Go sono piuttosto di basso livello. Gorm porta il mondo della mappatura oggettuale relazionale a Go con le seguenti funzionalità:

  • Associazioni (ha uno, ha molti, appartiene a, molti a molti, polimorfismo)
  • Richiamate (Prima / Dopo Crea / Salva / Aggiorna / Elimina / Trova)
  • Precaricamento (caricamento avido)
  • Le transazioni
  • Chiave primaria composita
  • SQL Builder
  • Migrazioni automatiche
  • logger
  • Plugin estensibili e di scrittura basati sui callback GORM

Ma non copre tutto. Se vieni da Python, non aspettarti la magia di SQLAlchemy. Per cose più fantasiose, dovrai fare un livello inferiore. Ecco un esempio di come usare Gorm con sqlite. Nota l'incorporato gorm.Model nella struttura del prodotto.

pacchetto main import ("github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite") tipo Product struct gorm.Model Codice stringa Prezzo uint func main () db, err: = gorm.Open ("sqlite3", "test.db") se err! = nil panico ("impossibile connettere il database") defer db.Close () // Migrazione dello schema db.AutoMigrate (& Prodotto ) / / Crea db.Create (& Product Codice: "L1212", Prezzo: 1000) // Leggi prodotto var Prodotto db.First (& product, 1) // cerca prodotto con id 1 db.First (& product, "code =? "," L1212 ") // Aggiorna - aggiorna il prezzo del prodotto a 2000 db.Model (e prodotto) .Update (" Prezzo ", 2000) // Elimina - elimina prodotto db.Delete (e prodotto)

6. Oca

Uno dei compiti più importanti quando si lavora con database relazionali è la gestione dello schema. La modifica dello schema del DB è considerata una modifica "spaventosa" in alcune organizzazioni. Il pacchetto goose consente di eseguire modifiche dello schema e persino migrazioni di dati, se necessario. Puoi d'oca e piuma d'oca andare avanti e indietro. Presta attenzione ai tuoi dati, però, e assicurati che non vada perso o corrotto.

Goose funziona eseguendo il versioning dello schema e utilizzando i file di migrazione corrispondenti a ciascuno schema. I file di migrazione possono essere comandi SQL o comandi Go. Ecco un esempio di un file di migrazione SQL che aggiunge una nuova tabella:

-- +goose Up CREATE TABLE person (id int NOT NULL, nome del testo, age int, PRIMARY KEY (id)); - + piuma d'oca DROP TABLE person;

Il -- +d'oca e -- +piuma d'oca i commenti dicono a cosa fare per aggiornare o downgrade dello schema.

7. Glide

Glide è un gestore di pacchetti per Go. Sotto un singolo GOPATH, potresti avere molti programmi con dipendenze in conflitto. La soluzione è fare in modo che ogni programma gestisca la propria directory del fornitore delle dipendenze del pacchetto. Glide aiuta con questo compito.

Ecco le caratteristiche della planata:

  • Supporta i pacchetti di versioning incluso il supporto alla versione 2.0.0 di Semantic Version.
  • Supporta pacchetti di aliasing (ad esempio per lavorare con le forchette di github).
  • Rimuovi la necessità di importare le dichiarazioni di importazione.
  • Lavora con tutti gli strumenti di go.
  • Supporta tutti gli strumenti VCS supportati da Go (git, bzr, hg, svn).
  • Supporta plug-in personalizzati locali e globali.
  • Memorizzazione nella cache del repository e memorizzazione nella cache dei dati per prestazioni migliorate.
  • Appiattisci le dipendenze, risolvendo le differenze di versione ed evitando l'inclusione di un pacchetto più volte.
  • Gestisci e installa le dipendenze su richiesta o vendute nel tuo sistema di controllo delle versioni. 

Le dipendenze sono memorizzate in glide.yaml, e glide fornisce diversi comandi per gestire le dipendenze:

 create, init Inizializza un nuovo progetto, creando un glide.yaml file config-wizard, cw Wizard che fornisce suggerimenti opzionali per migliorare la configurazione in un file glide.yaml. Installa uno o più pacchetti in "fornitore /" e aggiungi dipendenza a glide.yaml. remove, rm Rimuove un pacchetto dal file glide.yaml e rigenera il file di lock. import Importa file da altri sistemi di gestione delle dipendenze. nome Stampa il nome di questo progetto. novendor, nv Elenca tutti i percorsi non vendor in una directory. Ricostruisci Ricostruisci ('go build') l'installazione delle dipendenze, i Installa l'aggiornamento delle dipendenze di un progetto, in alto Aggiorna l'albero delle dipendenze di un progetto (Deprecato) Albero stampa le dipendenze di questo progetto come una struttura. lista Lista stampa tutte le dipendenze che il codice presente fa riferimento. info Info stampa le informazioni su questo progetto cache-clear, cc Cancella la cache Glide. Informazioni su Glide mirror Gestisci aiuto specchi, h Mostra un elenco di comandi o guida per un comando

8. Ginkgo

Ginkgo è un framework di test BDD (Behavior Driven Development). Ti consente di scrivere i tuoi test in una sintassi simile all'inglese e consentire a persone meno tecniche di rivedere i test (e il loro output) e verificare che soddisfino i requisiti aziendali. 

Ad alcuni sviluppatori piace anche questo stile di specifica del test. Si integra con il pacchetto di test integrato di Go ed è spesso combinato con Gomega. Ecco un esempio di un test Ginkgo + Gomega:

actual, err: = foo () Ω (err) .Should (BeNil ()) Ω (actual) .ShouldNot (BeNil ()) Ω (actual.result) .Should (Equal (100))

9. Etcd

Etcd è un negozio Key-Value distribuito affidabile. Il server è implementato in Go e il client Go interagisce con esso anche se gRPC.

Si concentra su quanto segue:

  • Semplice: API ben definita e orientata all'utente (gRPC).
  • Sicuro: TLS automatico con autenticazione CERT client opzionale.
  • Veloce: benchmark di 10.000 scritture / sec.
  • Affidabile: correttamente distribuito usando Raft.

Ecco un esempio di connessione al server, mettendo un valore e ricevendolo, inclusi timeout e pulizia.

func test_get () cli, err: = clientv3.New (clientv3.Config Endpoint: endpoint, DialTimeout: dialTimeout,) se err! = nil log.Fatal (err) rimanda cli.Close () _, err = cli.Put (context.TODO (), "foo", "bar") se err! = nil log.Fatal (err) ctx, cancel: = context.WithTimeout (context.Background (), requestTimeout) resp , err: = cli.Get (ctx, "foo") cancel () se err! = nil log.Fatal (err) per _, ev: = range resp.Kvs fmt.Printf ("% s:% s \ n ", ev.Key, ev.Value) // Output: foo: bar

10. NSQ

NSQ è una grande coda distribuita. L'ho usato con successo come elemento fondamentale per i sistemi distribuiti su larga scala. Ecco alcune delle sue caratteristiche:

  • Supporta topologie distribuite senza SPOF.
  • Scalabile orizzontalmente (nessun broker, aggiungere senza problemi più nodi al cluster).
  • Invio di messaggi basati su push a bassa latenza (prestazioni).
  • Routing di messaggi combinati con stile di carico bilanciato e multicast.
  • Excel con carichi di lavoro sia in streaming (ad alto throughput) che orientati al lavoro (a basso throughput).
  • Principalmente in memoria (oltre i messaggi di un high water mark vengono mantenuti in modo trasparente sul disco).
  • Servizio di rilevamento runtime per i consumatori alla ricerca di produttori (nsqlookupd).
  • Transport layer security (TLS).
  • Formato dati agnostico.
  • Poche dipendenze (facile da implementare) e una sana configurazione predefinita.
  • Semplice protocollo TCP che supporta le librerie client in qualsiasi lingua.
  • Interfaccia HTTP per statistiche, azioni di amministrazione e produttori (nessuna libreria client necessaria per la pubblicazione).
  • Si integra con statsd per la strumentazione in tempo reale.
  • Robusta interfaccia di amministrazione del cluster (nsqadmin).

Ecco come pubblicare un messaggio su NSQ (la gestione degli errori viene elisa):

pacchetto main import ("github.com/bitly/go-nsq") func main () config: = nsq.NewConfig () p, _: = nsq.NewProducer ("127.0.0.1:4150", config) p. Pubblica ("argomento", [] byte ("messaggio")) p.Stop ()

Ed ecco come consumare:

pacchetto main import ("sync" "fmt" "github.com/bitly/go-nsq") func main () wg: = & sync.WaitGroup  wg.Add (1) config: = nsq.NewConfig () q , _: = nsq.NewConsumer ("topic", "channel", config) handler: = nsq.HandlerFunc (func (messaggio * nsq.Message) error fmt.Printf ("Hai un messaggio:% v", messaggio) wg.Done () return nil) q.AddHandler (gestore) q.ConnectToNSQD ("127.0.0.1:4150") wg.Wait ()

11. Docker

Docker è un nome familiare ora (se i membri della tua famiglia sono per lo più persone DevOps). Potresti non sapere che Docker è implementato in Go. Solitamente non usi Docker nel tuo codice, ma è un progetto significativo e merita di essere riconosciuto come un progetto Go di enorme successo e popolare.

12. Kubernetes

Kubernetes è una piattaforma di orchestrazione di contenitori open source per applicazioni native cloud. È un altro sistema distribuito di mostri implementato in Go. Recentemente ho scritto un libro intitolato Mastering Kubernetes in cui vado in dettaglio sugli aspetti più avanzati di Kubernetes. Dal punto di vista dello sviluppatore Go, Kubernetes è molto flessibile e puoi estenderlo e personalizzarlo tramite plugin.

Conclusione

Go è una lingua fantastica. La sua filosofia di design è quella di essere un linguaggio semplice e accessibile. La sua libreria standard non è completa come alcuni altri linguaggi come Python. 

La community di Go è migliorata e ci sono molte librerie di alta qualità che puoi usare nei tuoi programmi. In questo articolo, ho introdotto 12 librerie. Ti incoraggio a cercare altre librerie prima di saltare e implementare tutto da zero.