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.
Î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.
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)
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.
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.
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]]
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:
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)
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.
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:
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ă
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 ()) Ω
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:
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
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:
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 ()
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.
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.
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.