12 Pachete indispensabile de mers și biblioteci

Go este un limbaj uimitor, cu mult impuls, și se concentrează pe simplitate. Această abordare este evidentă în biblioteca standard, care oferă toate elementele esențiale, dar nu mult mai mult. 

Din fericire, Go are o comunitate vibrantă care creează și împărtășește o mulțime de biblioteci terțe. În acest tutorial, vă prezint 12 dintre cele mai bune pachete și biblioteci Go. Unele dintre ele au un domeniu relativ redus și pot fi adăugate la orice proiect, în timp ce altele sunt proiecte uriașe pe care le puteți integra în sisteme distribuite masive, de mari dimensiuni.

Mergi minunat

Înainte de a vă scufunda în biblioteci în sine, permiteți-mi să vă prezint Awesome Go, o listă foarte activă și curativă a bibliotecilor Go și a altor resurse. Ar trebui să vizitați din când în când și să verificați ce este nou.

1. Golang-Set

Go are arrayuri, felii și hărți, dar nu are o structură de date setată. Puteți imita un set cu o hartă a boolelor, însă este frumos să aveți un tip de date real cu operațiile și semantica potrivite. Aici intră golang-setul. Iată un exemplu de bază pentru crearea unui nou set, adăugarea de elemente și testarea pentru aderare:

pachetul principal de import ("fmt" "github.com/deckarep/golang-set") func principal () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Albastru") basicColors. Adăugați ("verde") dacă elementul BasicColors.Contains ("verde") fmt.Println ("Yay! 'Green este o culoare de bază") altceva fmt.Println ("Ce dezamăgire! de bază ") dacă BasicColors.Contains (" galben ") fmt.Println (" Yay! "Yellow este o culoare de bază") altceva fmt.Println ("Ce dezamăgire! culoare ") Ieșire: Da! "Verde" este o culoare de bază Ce dezamăgire! "Galben" nu este o culoare de bază

Rețineți că numele pachetului este "mapset". În plus față de elementele de bază, efectuați toate operațiile setate, cum ar fi unirea, intersecția și diferența. Puteți, de asemenea, să repetați valorile setate: 

pachetul principal de import ("fmt" "github.com/deckarep/golang-set") func principal () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Albastru") basicColors. Adăugați ("Verde") altColori: = mapset.NewSetFromSlice ([] interfață  "Orange", "Galben", "Indigo", "Violet") rainbowColors: = baseColors.Union rainbowColors.Iterator () C fmt.Println (culoare)

2. Culoare

Să continuăm cu tema culorii. Când scrieți programe de linie de comandă, este util să folosiți culori pentru a evidenția mesaje importante sau pentru a distinge între erori, succese și avertismente. 

Pachetul de culori oferă o modalitate ușoară de a adăuga o anumită culoare programelor dvs. (vedeți ce am făcut acolo?). Utilizează codurile de evacuare ANSII și suportă și Windows! Iată un exemplu rapid:

pachetul principal de import ("github.com/fatih/color") func main () color.Red ("Trandafiri sunt roșii") color.Blue ("Violete sunt albastru") 

Pachetul de culori acceptă amestecarea culorilor cu culori de fundal, stiluri precum bold sau italic și stropirea culorii cu ieșire non-color.

pachetul import principal ("github.com/fatih/color" "fmt") func main () minion: = culoare.New (color.FgBlack) .Add (color.BgYellow) .Add (color.Bold) minion.Println ("Minion spune: banana !!!!!!") m: = minion.PrintInFunc () m ("Vreau o altă banană !!!!!") slantedRed: = color.New (color.FgRed, color.BgWhite , color.Italic) .SprintFunc () fmt.Println ("Am facut un imens", slantedRed ("mistake")) 

Pachetul de culori are și alte caracteristici utile. Continuați și explorați mai multe.

3. Acum

Acum este un pachet foarte simplu care oferă un pachet de confort pentru pachetul de timp standard și facilitează lucrul cu diverse construcții de dată și timp în jurul momentului. 

De exemplu, puteți obține începutul minutei curente sau sfârșitul celui mai apropiat duminică la ora curentă. Iată cum să utilizați "acum":

pachet import principal ("github.com/jinzhu/now" "fmt") func main () fmt.Println ("Toate începuturile ...") fmt.Println (now.BeginningOfMinute ()) fmt.Println (now.BeginningOfHour () .primul (). ÎnceputOfDay ()) fmt.Println (now.BeginningOfWeek ()) fmt.Println (now.BeginningOfMonth ()) fmt.Println (now.BeginningOfQuarter ()) fmt.Println (now.BeginningOfYear ()) Ieșire: Toate începuturile ... 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 

De asemenea, puteți analiza timpii și chiar puteți adăuga propriile formate (care vor necesita actualizarea formatelor cunoscute). Acum tip embeds time.Time, astfel încât să puteți folosi toate time.Time metode direct pe Acum obiecte.

4. Gen.

Instrumentul pentru gen generează codul pentru dvs. - în special, codul care ține cont de tip, care încearcă să atenueze decalajul de a nu avea șabloane sau generice în Go.

Adnotați tipurile dvs. cu un comentariu special și genul generează fișierele sursă pe care le includeți în proiectul dvs. Nicio magie de execuție. Să vedem un exemplu. Aici este un tip adnotat.

// + gen slice: "În cazul în care, Count, GroupBy [int]", tastați Persoană struct Nume șir Vârstă int 

Alergare gen (asigurați-vă că este în cale) generează person_slice.go:

// Generat de: gen // TypeWriter: slice // Directiva: + gen pe Person pachet principal // PersonSlice este o felie de tip Person. Utilizați-l acolo unde ați folosi [] Persoana. tip PersonSlice [] Persoană // În cazul în care returnează o nouă Persoană a cărei elementele returnează true pentru func. A se vedea: http://clipperhouse.github.io/gen/#Dacă func (rcv PersonSlice) Unde (fn func (Person) bool) (rezultat PersonSlice) pentru _, v: = interval rcv  result = append (rezultat, v) rezultatul retur // Count dă numărul elementelor din PersonSlice care se întorc adevărat pentru funcția trecută. A se vedea: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Număr (fn func (Person) bool) (rezultat int) pentru _, v: = interval rcv  rezultatul ++ returnați // // Gruparea elementelor grupurilor într-o hartă tastată de int. A se vedea: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt (fn func (Person) int) harta [int] PersonSlice result: = make (map [int] PersonSlice) v: = interval rcv key: = fn (v) rezultat [key] = append (rezultatul [key], v) 

Codul oferă metode asemănătoare LINQ pentru a funcționa pe PersonSlice tip. Este simplu de înțeles și documentat frumos. 

Iată cum îl folosiți. În funcția principală, a PersonSlice este definit. vârstă() funcția selectează câmpul de vârstă de la ea Persoană argument. Generat GroupByInt () funcția ia vârstă() funcția și returnează oamenii din felie grupată după vârsta lor (34 este doar Jim, dar 23 are atât Jane și Kyle).

pachetul principal import ("fmt") // + gen slice: "unde, Count, GroupBy [int] people: = PersonSlice "Jim", 34, "Jane", 23, "Kyle", 23, groupedByAge: = people.GroupByInt (vârstă) fmt.Println (groupedByAge) [34: 34 23: Jane 23 Kyle 23]]

5. Gorm

Go este cunoscut pentru natura sa spartană. Programarea bazelor de date nu este diferită. Cele mai populare biblioteci DB pentru Go sunt destul de joase. Gorm aduce lumea mapării obiect-relaționale la Go cu următoarele caracteristici:

  • Asociații (are unul, are multe, aparține multora, polimorfism)
  • Comenzi rapide (înainte / după Creare / Salvare / Actualizare / Ștergere / Găsire)
  • Preîncărcarea (încărcare dornică)
  • tranzacţii
  • Cheie primară compusă
  • SQL Builder
  • Migrații automate
  • Logger
  • Extensibil, scrie Plugin-uri bazate pe apeluri GORM

Dar nu acoperă totul. Dacă veniți din Python, nu vă așteptați la magie. Pentru mai multe lucruri fanteziste, va trebui să mergeți la un nivel inferior. Iată un exemplu de utilizare a lui Gorm cu sqlite. Rețineți încorporat gorm.Model în structura produsului.

pachetul principal de import ("github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite") tip struct structură gorm.Model Cod șir price uint func principal () db, err: = grom.Open ("sqlite3", "test.db") dacă err! = nil panic ("nu a reușit să se conecteze baza de date") defer db.Close () // Migrați schema db.AutoMigrate / Creare db.Create (& Produs Cod: "L1212", Pret: 1000) // Citeste var produs Produs db.First (& produs, 1) // gaseste produsul cu id 1 db.First (& product, code =? "," L1212 ") // Update - actualizați prețul produsului la 2000 db.Model (& produs) .Update (" Price ", 2000)

6. Gâsca

Una dintre cele mai importante sarcini în lucrul cu bazele de date relaționale este gestionarea schemei. Modificarea schemei DB este considerată o schimbare "înfricoșătoare" în unele organizații. Pachetul de gâscă vă permite să efectuați modificări ale schemelor și chiar migrări de date, dacă este necesar. Poti gâscă în sus și gâscă în jos pentru a merge înainte și înapoi. Gândiți-vă, totuși, datele și asigurați-vă că nu se vor pierde sau vor fi corupte.

Goose funcționează prin versiunea schemei și utilizând fișierele de migrare corespunzătoare fiecărei scheme. Fișierele de migrare pot fi comenzi SQL sau comenzi Go. Iată un exemplu de fișier de migrare SQL care adaugă un nou tabel:

-- +goose Up CREATE TABLE persoană (id int NU NULL, text nume, vârstă int, PRIMARY KEY (id)); - + gâscă jos DROP TABLE persoană;

-- +gâscă în sus și -- +gâscă în jos comentarii spune gâscă ce să facă pentru a face upgrade sau downgrade schema.

7. Glidează

Glide este un manager de pachete pentru Go. Sub un singur GOPATH, este posibil să aveți multe programe care au dependențe conflictuale. Soluția este ca fiecare program să administreze propriul director de furnizori de dependențe de pachete. Glide ajută la această sarcină.

Iată caracteristicile de alunecare:

  • Pachete de suport pentru versiuni, inclusiv suport pentru Semantic Version 2.0.0.
  • Pachete de alianță de sprijin (de ex. Pentru lucrul cu furculițe).
  • Îndepărtați necesitatea de a declara declarații de import.
  • Lucrați cu toate instrumentele go.
  • Suporta toate instrumentele VCS pe care Go le suporta (git, bzr, hg, svn).
  • Suportă pluginurile locale și globale personalizate.
  • Depozitarea cache-ului depozitului și cache-ul de date pentru o performanță îmbunătățită.
  • Aplicați dependența, rezolvând diferențele de versiune și evitând includerea unui pachet de mai multe ori.
  • Gestionați și instalați dependențe la cerere sau vândute în sistemul de control al versiunilor. 

Dependențele sunt stocate în glide.yaml, și glide oferă mai multe comenzi pentru a gestiona dependențele:

 create, init Inițiați un nou proiect, creând un expert de configurare a fișierelor glide.yaml, cw Wizard care face sugestii opționale pentru a îmbunătăți config într-un fișier glide.yaml. get Instalați unul sau mai multe pachete în "furnizor /" și adăugați dependența de glide.yaml. remove, rm Eliminați un pachet din fișierul glide.yaml și regenerați fișierul de blocare. importați fișierele din alte sisteme de gestionare a dependenței. nume Imprimați numele acestui proiect. novendor, nv Listați toate căile non-furnizoare dintr-un director. rebuild Rebuild ('go build') instalarea dependențelor, i Instalați o actualizare a dependențelor unui proiect, în sus Actualizarea arborelui de dependență a unui proiect (Deprecated) Arborele imprimă dependențele acestui proiect ca arbore. List listă imprimă toate dependențele pe care le face referiri la prezentul cod. info Info tipărește informații despre acest proiect cache-clear, cc Șterge cache-ul Glide. despre Aflați despre Glide mirror Gestionați ajutorul pentru oglinzi, h Afișează o listă de comenzi sau ajutor pentru o comandă

8. Ginkgo

Ginkgo este un cadru de testare BDD (Behavior Driven Development). Vă permite să vă scrieți testele într-o sintaxă care seamănă cu engleza și permiteți oamenilor mai puțin tehnici să revizuiască testele (și rezultatele lor) și să verifice dacă acestea corespund cerințelor afacerii. 

Unii dezvoltatori preferă acest tip de specificație de testare. Se integrează cu pachetul Go de testare încorporat și este adesea combinat cu Gomega. Iată un exemplu al unui test Ginkgo + Gomega:

actuală, err: = foo () Ω (err) .Ar trebui să fie (BeNil ()) Ω (actual) .ShouldNot (BeNil ()) Ω

9. Etd

Etcd este un magazin de încredere distribuit Key-Value. Serverul este implementat în Go, iar clientul Go interacționează cu el, deși gRPC.

Se concentrează pe următoarele:

  • Simplu: API bine definită, orientată spre utilizator (gRPC).
  • Secure: TLS automată cu autentificarea opțională a clientului.
  • Rapid: benchmarked 10.000 de scrieri / sec.
  • Fiabilă: distribuită corespunzător folosind raftul.

Iată un exemplu de conectare la server, punerea unei valori și obținerea acestuia, inclusiv expirarea timpului și curățarea.

func test_get () cli, err: = clientv3.New (clientv3.Config Endpoints: endpoints, DialTimeout: dialTimeout,) err! = nil log.Fatal (err) defer cli.Close = cli.Put (context.TODO (), "foo", "bar") dacă err! = nil log.Fatal (err) ctx, cancel: = context.WithTimeout (context.Background , err: = cli.Get (ctx, "foo") anulează () dacă err! = nil log.Fatal (err) pentru _, ev: s \ n ", ev.Key, ev.Value) // Output: foo: bar

10. NSQ

NSQ este o coadă foarte distribuită. Am folosit-o cu succes ca bloc constructiv pentru sistemele distribuite pe scară largă. Iată câteva dintre caracteristicile sale:

  • Sprijină topologii distribuite fără SPOF.
  • Scalabil pe orizontală (fără brokeri, adăugați fără probleme mai multe noduri în cluster).
  • Ofertă de livrare a mesajelor bazate pe împingerea la minimum (performanță).
  • Combinație de încărcare-balansate și multicast stil mesaj de rutare.
  • Excel la ambele fluxuri de streaming (high-throughput) și orientate spre locuri de muncă (low-throughput).
  • Mai întâi în memorie (dincolo de mesajele de marcă de apă ridicată sunt păstrate în mod transparent pe disc).
  • Runtime serviciu de descoperire pentru consumatori pentru a găsi producători (nsqlookupd).
  • Securitatea stratului de transport (TLS).
  • Formatul de date agnostic.
  • Puține dependențe (ușor de instalat) și o configurație implicită, limitată, implicită.
  • Protocolul TCP simplu, care suportă bibliotecile clienților în orice limbă.
  • Interfață HTTP pentru statistici, acțiuni de administrare și producători (nu este necesară publicarea unei biblioteci de clienți).
  • Se integrează cu statsd pentru instrumente în timp real.
  • Interfață robustă de administrare a clusterului (nsqadmin).

Iată cum să publicați un mesaj către NSQ (tratarea erorilor este eliminată):

pachetul principal de import ("github.com/bitly/go-nsq") func main () config: = nsq.NewConfig () p, _: = nsq.NewProducer ("127.0.0.1:4150", config) Publicați ("topic", [] octet ("mesaj")) p.Stop ()

Iată cum să consumăm:

pachetul principal de import ("sync" "fmt" "github.com/bitly/go-nsq") func main () wg: = & sync.WaitGroup  wg.Add (1) config: = nsq.NewConfig , _: = nsq.NewConsumer ("subiect", "canal", config) handler: = nsq.HandlerFunc (func (message * nsq.Message) eroare fmt.Printf (mesajul " wg.Done () întoarce nil) q.AddHandler (handler) q.ConnectToNSQD ("127.0.0.1:4150") wg.Wait ()

11. Docker

Docker-ul este acum un nume de uz casnic (dacă membrii familiei dvs. sunt în cea mai mare parte persoane de la DevOps). Este posibil să nu știți că Docker este implementat în Go. Nu utilizați în mod obișnuit Docker în codul dvs., dar este un proiect semnificativ și merită să fie recunoscut ca un proiect de succes, extrem de reușit și popular.

12. Kubernetes

Kubernetes este o platformă open-source pentru orchestrarea containerului pentru aplicații de tip "cloud-native". Este un alt sistem distribuit de monstri implementat în Go. Recent am scris o carte numită Mastering Kubernetes, unde mă duc în detaliu asupra celor mai avansate aspecte ale lui Kubernetes. Din punctul de vedere al dezvoltatorului Go, Kubernetes este foarte flexibil și vă puteți extinde și personaliza prin pluginuri.

Concluzie

Go este un limbaj minunat. Filozofia sa de design este o limbă simplă și accesibilă. Biblioteca standard nu este la fel de cuprinzătoare ca alte limbi, cum ar fi Python. 

Comunitatea Go a crescut și există multe biblioteci de înaltă calitate pe care le puteți utiliza în programele dvs. În acest articol, am introdus 12 biblioteci. Vă încurajez să căutați alte biblioteci înainte de a sări și de a implementa totul de la zero.

Cod