Go er et fantastisk språk med mye fart, og det er fokusert på enkelhet. Denne tilnærmingen er tydelig i sitt standardbibliotek, som gir alle essensielle, men ikke mye mer.
Heldigvis har Go et levende samfunn som lager og deler mange tredjepartsbiblioteker. I denne opplæringen vil jeg introdusere deg til 12 av Gos beste pakker og biblioteker. Noen av dem har relativt smalt omfang og kan legges til noen prosjekter, mens andre er store prosjekter som du kan innlemme i massive, store distribuerte systemer.
Før du går inn i bibliotekene selv, la meg introdusere deg til Awesome Go, en veldig aktiv og kurert liste over Go-biblioteker og andre ressurser. Du bør besøke nå og da og sjekke hva som er nytt.
Go har arrays, skiver og kart, men det har ingen datastruktur. Du kan etterligne et sett med et kart over bools, men det er fint å ha en faktisk datatype med riktig operasjon og semantikk. Dette er hvor golang-set kommer inn. Her er et grunnleggende eksempel på å lage et nytt sett, legge til elementer og teste for medlemskap:
pakke viktigste import ("fmt" "github.com/deckarep/golangset") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Legg til ("Grønn") hvis basicColors.Contains ("Green") fmt.Println ("Yay!" Green "er en grunnleggende farge") else fmt.Println ("What a disappointment!" Green "er ikke en grunnleggende farge ") hvis basicColors.Contains (" Yellow ") fmt.Println (" Yay! "Yellow" er en grunnleggende farge ") else fmt.Println (" Hva en skuffelse! "Gul" er ikke en grunnleggende farge ") Utgang: Yay! 'Grønn' er en grunnleggende farge Hva en skuffelse! 'Gul' er ikke en grunnleggende farge
Merk at pakkenavnet er "mapset". I tillegg til det grunnleggende, utfører du alle satt operasjoner som forening, skjæringspunkt og forskjell. Du kan også iterere over de angitte verdiene:
pakke viktigste import ("fmt" "github.com/deckarep/golangset") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Legg til ("Grønn") otherColors: = mapset.NewSetFromSlice ([] interface "Orange", "Yellow", "Indigo", "Violet") rainbowColors: = basicColors.Union (otherColors) for farge: = rekkevidde rainbowColors.Iterator () .C fmt.Println (farge)
La oss fortsette med fargetemaet. Når du skriver kommandolinjeprogrammer, er det nyttig å bruke farger for å markere viktige meldinger eller skille mellom feil, suksesser og advarsler.
Fargepakken gir en enkel måte å legge til litt farge på programmene dine (se hva jeg gjorde der?). Den bruker ANSII escape-koder og støtter også Windows! Her er et raskt eksempel:
pakke viktigste import ("github.com/fatih/color") func main () color.Red ("Roses er rød") color.Blue ("Violets er blå")
Fargepakken støtter blandingsfarger med bakgrunnsfarger, stilarter som fet eller kursiv, og sprinklerfarge med ikke-fargeutgang.
pakke viktigste import ("github.com/fatih/color" "fmt") func main () minion: = color.New (color.FgBlack) .Add (color.BgYellow) .Add (color.Bold) minion.Println ("Minion sier: banan !!!!!!") m: = minion.PrintlnFunc () m ("Jeg vil ha en annen banan !!!!!") slantedRed: = color.New (color.FgRed, color.BgWhite , color.Italic) .SprintFunc () fmt.Println ("Jeg har gjort en stor", slantedRed ("feil"))
Fargepakken har andre nyttige funksjoner. Gå videre og utforske mer.
Nå er en veldig enkel pakke som gir en praktisk innpakning for standard tidspakke og gjør det enkelt å arbeide med ulike dato- og tidkonstruksjoner rundt den nåværende tiden.
For eksempel kan du få begynnelsen av nåværende minutt eller slutten av søndagen nærmest den nåværende tiden. Slik bruker du "nå":
pakke viktigste import ("github.com/jinzhu/now" "fmt") func main () fmt.Println ("All beginning ...") 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 ()) Utgang: Alle begynnelsen ... 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
Du kan også analysere ganger og til og med legge til egne formater (som krever oppdatering av de kjente formatene). De Nå
type embedsmuligheter time.Time
, slik at du kan bruke alle time.Time
metoder direkte på Nå
objekter.
Gen-verktøyet genererer kode for deg - spesielt typebevisst kode som forsøker å lindre gapet mellom å ikke ha maler eller generikk i Go.
Du annoterer typene dine med en spesiell kommentar, og gen genererer kildefiler du inkluderer i prosjektet. Ingen runtime magi. La oss se et eksempel. Her er en annotert type.
// + genskive: "Hvor, Count, GroupBy [int]" type Person struct Navn streng Alder int
Løping gen
(sørg for at det er i din vei) genererer person_slice.go
:
// Generert av: gen // TypeWriter: skive // Direktiv: + gen på Personpakke main // PersonSlice er et stykke persontype. Bruk den der du vil bruke [] Person. type PersonSlice [] Person // Hvor returnerer en ny PersonSlice hvis elementene returnerer sant for func. Se: http://clipperhouse.github.io/gen/#War func (rcv PersonSlice) Hvor (fn func (Person) bool) (resultat PersonSlice) for _, v: = rekkevidde rcv if fn (v) result = add (result, v) returresultat // Count gir tallelementene til PersonSlice som returnerer sant for passerte func. Se: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Count (fn func (Person) bool) (resultat int) for _, v: = rekkevidde rcv if fn (v) result ++ return // GroupByInt grupperer elementer til et kart tastet av int. Se: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt (fn func (Person) int) map [int] PersonSlice result: = make (map [int] PersonSlice) for _, v: = rekkevidde rcv nøkkel: = fn (v) resultat [nøkkel] = legg til (resultat [tast], v) returresultat
Koden gir LINQ-lignende metoder for å operere på PersonSlice
type. Det er enkelt å forstå og pent dokumentert.
Slik bruker du den. I hovedfunksjonen a PersonSlice
er definert. De alder()
funksjonen velger aldersfeltet fra dets Person
argument. Den genererte GroupByInt ()
funksjonen tar alder()
funksjon og returnerer folkene fra stykket gruppert etter deres alder (34 er bare Jim, men 23 har både Jane og Kyle).
pakke hovedinnføring ("fmt") // + genskive: "Hvor, Count, GroupBy [int]" type Person struktur Navn streng Alder int func age (p Person) int return p.Age func main people: = PersonSlice "Jim", 34, "Jane", 23, "Kyle", 23, groupedByAge: = people.GroupByInt (alder) fmt.Println (groupedByAge) Utgang: kart [34: [Jim 34] 23: [Jane 23 Kyle 23]]
Go er kjent for sin spartanske natur. Database programmering er ikke annerledes. De mest populære DB-bibliotekene for Go er ganske lavt nivå. Gorm bringer verden av objektrelasjonell kartlegging til Go med følgende funksjoner:
Men det dekker ikke alt. Hvis du kommer fra Python, ikke forvent SQLAlchemy magi. For mer fancy ting må du gå et lavere nivå. Her er et eksempel på hvordan du bruker Gorm med sqlite. Merk den innebygde gorm.Model
i produktstrukturen.
pakke viktigste import ("github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite") type Produktstruktur gorm.Model Kode streng Pris uint func main () db, err: = gorm.Open ("sqlite3", "test.db") hvis err! = null (panikk ("klarte ikke å koble databasen") defer db.Close () // Migrere skjemaet db.AutoMigrate (& Product ) / / Create db.Create (& Product Code: "L1212", Pris: 1000) // Les var produkt Produkt db.First (& produkt, 1) // finn produkt med id 1 db.First (& product, "code =? "," L1212 ") // Oppdater - oppdater produktprisen til 2000 db.Model (& produkt) .Update (" Pris ", 2000) // Slett - slett produkt db.Delete (& produkt)
En av de viktigste oppgavene når man arbeider med relasjonsdatabaser, håndterer skjemaet. Endring av DB-skjemaet regnes som en "skummel" endring i noen organisasjoner. Goose-pakken lar deg utføre skjemaendringer og til og med dataoverføringer om nødvendig. Du kan gås opp
og gås ned
å gå frem og tilbake. Vær oppmerksom på dataene dine, og sørg for at det ikke blir tapt eller ødelagt.
Goose fungerer ved å variere skjemaet ditt og bruke migreringsfiler som svarer til hvert skjema. Migreringsfilene kan være SQL-kommandoer eller Go-kommandoer. Her er et eksempel på en SQL-migreringsfil som legger til et nytt bord:
-- +gås opp CREATE TABLE person (id int IKKE NULL, navn tekst, alder int, PRIMARY KEY (id)); - + gås ned DROP TABLE person;
De -- +gås opp
og -- +gås ned
kommentarer forteller goose hva du skal gjøre for å oppgradere eller nedgradere skjemaet.
Glide er en pakkebehandling for Go. Under en enkelt GOPATH
, Du kan ha mange programmer som har motstridende avhengigheter. Løsningen er å få hvert program til å administrere sin egen leverandørkatalog med pakkeavhengigheter. Glide hjelper med denne oppgaven.
Her er funksjonene til glide:
Avhengighetene lagres i glide.yaml, og glide gir flere kommandoer for å håndtere avhengigheter:
opprett, init Initialiser et nytt prosjekt, opprett en glide.yaml filkonfigurasjonsveiviser, cw Wizard som lager valgfrie forslag for å forbedre config i en glide.yaml-fil. få Installer en eller flere pakker til 'leverandør /' og legg til avhengighet til glide.yaml. fjern, rm Fjern en pakke fra glide.yaml-filen, og regenerere låsefilen. Import Importer filer fra andre avhengighetsstyringssystemer. navn Skriv ut navnet på dette prosjektet. novendor, nv Liste alle ikke-leverandørbaner i en katalog. gjenoppbygg Rebuild ('go build') avhengighetene installeres, jeg installerer et prosjekts avhengighetsoppdatering, opp Oppdater et prosjektets avhengighets-tre (Utdatert) Tree skriver ut avhengighetene til dette prosjektet som et tre. listeliste skriver ut alle avhengigheter som den nåværende koden refererer til. info Info skriver ut informasjon om dette prosjektet cache-clear, cc Fjerner Glide-cachen. om Lær om Glide-speil Administrer speilhjelp, h Viser en liste over kommandoer eller hjelp til en kommando
Ginkgo er et BDD (Behavior Driven Development) testramme. Det lar deg skrive tester i en syntaks som ligner engelsk og tillater mindre tekniske personer å gjennomgå tester (og deres utgang) og verifisere at de stemmer overens med bedriftskravene.
Noen utviklere liker denne typen testspesifikasjon også. Den integreres med Gos innebygde testpakke og kombineres ofte med Gomega. Her er et eksempel på en Ginkgo + Gomega test:
faktisk, feil: = foo () Ω (err) .Skal (BeNil ()) Ω (faktisk) .Skal ikke (BeNil ()) Ω (actual.result) .Skulle (Equal (100))
Etcd er en pålitelig distribuert nøkkelverdibutikk. Serveren er implementert i Go, og Go-klienten samhandler med den om gRPC.
Det fokuserer på følgende:
Her er et eksempel på å koble til serveren, sette en verdi og få den, inkludert timeout og opprydding.
func test_get () cli, err: = clientv3.New (clientv3.Config Endpoints: endpoints, DialTimeout: dialTimeout hvis err! = null log.Fatal (err) defer cli.Close () _, feil = cli.Put (context.TODO (), "foo", "bar") hvis err! = null log.Fatal (err) ctx, avbryt: = context.WithTimeout (context.Background (), requestTimeout) resp , err: = cli.Get (ctx, "foo") avbryt () hvis err! = null log.Fatal (err) for _, ev: = range resp.Kvs fmt.Printf ("% s:% s \ n ", ev.Key, ev.Value) // Output: foo: bar
NSQ er en stor distribuert kø. Jeg har brukt det med hell som en primær byggestein for store distribuerte systemer. Her er noen av funksjonene:
Slik publiserer du en melding til NSQ (Feilhåndtering er fjernet):
pakke viktigste import ("github.com/bitly/go-nsq") func main () config: = nsq.NewConfig () p, _: = nsq.NewProducer ("127.0.0.1:4150", config) s. Publiser ("emne", [] byte ("melding")) p.Stop ()
Og her er hvordan man forbruker:
pakke main import ("synkroniser" "fmt" "github.com/bitly/go-nsq") func main () wg: = og synk.WaitGroup wg.Add (1) config: = nsq.NewConfig () q , _: = nsq.NewConsumer ("topic", "channel", config) handler: = nsq.HandlerFunc (func (melding * nsq.Message) feil fmt.Printf ("Fikk en melding:% v", melding) wg.Done () return nil) q.AddHandler (handler) q.ConnectToNSQD ("127.0.0.1:4150") wg.Wait ()
Docker er et husnavn nå (hvis dine familiemedlemmer er for det meste DevOps folk). Du er kanskje ikke klar over at Docker er implementert i Go. Du bruker vanligvis ikke Docker i koden din, men det er et betydelig prosjekt og fortjener å bli anerkjent som et enormt vellykket og populært Go-prosjekt.
Kubernetes er en open-source container orkestrering plattform for cloud-native applikasjoner. Det er et annet monster distribuert system implementert i Go. Jeg skrev nylig en bok som heter Mastering Kubernetes, hvor jeg går i detalj over de mest avanserte aspektene av Kubernetes. Fra Go-utviklerens synspunkt er Kubernetes veldig fleksibel, og du kan utvide og tilpasse det via plugins.
Go er et flott språk. Dens designfilosofi er å være et enkelt og tilnærmet språk. Standardbiblioteket er ikke så omfattende som noen andre språk som Python.
Go-fellesskapet gikk opp, og det er mange biblioteker av høy kvalitet du kan bruke i programmene dine. I denne artikkelen introduserte jeg 12 biblioteker. Jeg oppfordrer deg til å lete etter andre biblioteker før du hopper inn og implementerer alt fra bunnen av.