12 onmisbare Go-pakketten en -bibliotheken

Go is een geweldige taal met veel momentum en gericht op eenvoud. Deze aanpak is duidelijk zichtbaar in de standaardbibliotheek, die alle essentiële functies biedt, maar niet veel meer. 

Gelukkig heeft Go een levendige community die veel externe bibliotheken maakt en deelt. In deze tutorial zal ik je voorstellen aan 12 van Go's beste pakketten en bibliotheken. Sommige hebben een relatief beperkte reikwijdte en kunnen aan projecten worden toegevoegd, terwijl andere enorme projecten zijn die u kunt opnemen in grote, grootschalige gedistribueerde systemen..

Awesome Go

Voordat je in de bibliotheken zelf duikt, wil ik je laten kennismaken met Awesome Go, een zeer actieve en samengestelde lijst met Go-bibliotheken en andere bronnen. Je moet zo nu en dan een bezoek brengen en kijken wat er nieuw is.

1. Golang-Set

Go heeft arrays, slices en maps, maar heeft geen vaste datastructuur. Je kunt een set nabootsen met een kaart van bools, maar het is leuk om een ​​echt gegevenstype te hebben met de juiste operaties en semantiek. Hier komt Golang-set aan. Hier is een eenvoudig voorbeeld van het maken van een nieuwe set, items toevoegen en testen op lidmaatschap:

pakket main import ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Toevoegen ("Groen") als basicColors.Contains ("Groen") fmt.Println ("Yay! 'Groen' is een basiskleur") else fmt.Println ("Wat een teleurstelling! 'Groen' is geen basiskleur ") if basicColors.Contains (" Yellow ") fmt.Println (" Yay! 'Yellow' is een basiskleur ") else fmt.Println (" Wat een teleurstelling! 'Geel' is geen standaard kleur ") Uitgang: Yay! 'Groen' is een basiskleur Wat een teleurstelling! 'Geel' is geen basiskleur

Merk op dat de pakketnaam "mapset" is. Naast de basisbeginselen voer je alle ingestelde bewerkingen uit, zoals unie, intersectie en verschil. U kunt ook de ingestelde waarden herhalen: 

pakket main import ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Red") basicColors.Add ("Blue") basicColors. Toevoegen ("Groen") otherColors: = mapset.NewSetFromSlice ([] interface  "Oranje", "Geel", "Indigo", "Violet") rainbowColors: = basicColors.Union (otherColors) voor kleur: = bereik rainbowColors.Iterator (). C fmt.Println (kleur)

2. Kleur

Laten we doorgaan met het kleurenthema. Bij het schrijven van opdrachtregelprogramma's is het handig om kleuren te gebruiken om belangrijke berichten te markeren of onderscheid te maken tussen fouten, successen en waarschuwingen. 

Het kleurenpakket geeft een eenvoudige manier om wat kleur toe te voegen aan je programma's (zie wat ik daar heb gedaan?). Het gebruikt ANSII-escape-codes en ondersteunt ook Windows! Hier is een snel voorbeeld:

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

Het kleurenpakket ondersteunt het mengen van kleuren met achtergrondkleuren, stijlen zoals vet of cursief, en sprenkelkleur met niet-kleurenuitvoer.

pakket main import ("github.com/fatih/color" "fmt") func main () minion: = color.New (color.FgBlack). Add (color.BgYellow) .Add (color.Bold) minion.Println ("Minion zegt: banana !!!!!!") m: = minion.PrintlnFunc () m ("Ik wil nog een banaan !!!!!") hellendRood: = kleur.Nieuw (kleur.FrRood, kleur.BgWit , color.Italic) .SprintFunc () fmt.Println ("I've made a huge", helledRed ("mistake") 

Het kleurenpakket heeft nog andere handige functies. Ga je gang en ontdek meer.

3. Nu

Nu is een heel eenvoudig pakket dat een gemakswikkel biedt voor het standaardtijdpakket en het gemakkelijk maakt om met verschillende datum- en tijdconstructies te werken rond de huidige tijd. 

U kunt bijvoorbeeld het begin van de huidige minuut of het einde van de zondag het dichtst bij de huidige tijd krijgen. Hier is hoe u "nu" kunt gebruiken:

pakket main import ("github.com/jinzhu/now" "fmt") func main () fmt.Println ("All the beginningings ...") 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: alle begin ... 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 

U kunt ook tijden parsen en zelfs uw eigen indelingen toevoegen (waarvoor de bekende indelingen moeten worden bijgewerkt). De Nu type instort time.Time, dus je kunt alle gebruiken time.Time methoden direct aan Nu voorwerpen.

4. Gen

De gen-tool genereert code voor u, in het bijzonder typebewuste code die de kloof probeert weg te nemen dat er geen sjablonen of generieken in Go zijn.

U annoteert uw typen met een speciale opmerking en gen genereert bronbestanden die u in uw project opneemt. Geen runtime-magie. Laten we een voorbeeld bekijken. Hier is een geannoteerd type.

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

hardlopen gen (zorg ervoor dat het op uw pad komt) genereert person_slice.go:

// Gegenereerd door: gen // TypeWriter: slice // Directive: + gen on Person package main // PersonSlice is een segment van het type Person. Gebruik het waar u [] Persoon zou gebruiken. type PersonSlice [] Persoon // Waar retourneert een nieuwe PersonSlice waarvan de elementen voor de functie terugkeren. Zie: http://clipperhouse.github.io/gen/#Where func (rcv PersonSlice) Where (fn func (Person) bool) (result PersonSlice) for _, v: = range rcv if fn (v)  result = append (result, v) return-resultaat // Count geeft de nummerelementen van PersonSlice die true retourneren voor de doorgegeven functie. Zie: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Count (fn func (Person) bool) (result int) for _, v: = range rcv if fn (v)  result ++ return // GroupByInt groepeert elementen in een kaart ingetoetst door int. Zie: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt (fn func (persoon) int) kaart [int] PersonSlice result: = make (kaart [int] PersonSlice) voor _, v: = bereik rcv key: = fn (v) result [key] = add (resultaat [sleutel], v) retourresultaat 

De code biedt LINQ-achtige methoden om te werken op de PersonSlice type. Het is eenvoudig te begrijpen en goed gedocumenteerd. 

Hier is hoe je het gebruikt. In de hoofdfunctie, a PersonSlice is gedefinieerd. De leeftijd() functie selecteert het leeftijdsveld uit zijn Persoon argument. De gegenereerde GroupByInt () functie neemt de leeftijd() functioneert en retourneert de mensen uit het segment gegroepeerd op hun leeftijd (34 is slechts Jim, maar 23 heeft zowel Jane als Kyle).

pakket main import ("fmt") // + gen slice: "Waar, Count, GroupBy [int]" type Person struct Name string 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: map [34: [Jim 34] 23: [Jane 23 Kyle 23]]

5. Gorm

Go staat bekend om zijn spartaanse karakter. Database programmeren is niet anders. De populairste DB-bibliotheken voor Go zijn behoorlijk laag. Gorm brengt de wereld van object-relationele mapping naar Go met de volgende functies:

  • Verenigingen (heeft er een, heeft veel, hoort bij, many to many, polymorfisme)
  • Terugbellen (voor / na maken / opslaan / bijwerken / verwijderen / zoeken)
  • Vooraf laden (gretig laden)
  • transacties
  • Samengestelde primaire sleutel
  • SQL Builder
  • Auto-migraties
  • houthakker
  • Uitbreidbaar, schrijf plug-ins op basis van GORM callbacks

Maar het dekt niet alles. Als je van Python komt, verwacht dan geen SQLAlchemie magie. Voor meer luxe dingen, moet je naar een lager niveau gaan. Hier is een voorbeeld van het gebruik van Gorm met sqlite. Let op de embedded gorm.Model in het Product struct.

pakket main import ("github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sqlite") type Product struct gorm.Model Code string Prijs uint func main () db, err: = gorm.Open ("sqlite3", "test.db") if err! = nil panic ("kon database niet verbinden") db.Close () // Migreer het schema db.AutoMigrate (& Product ) / / Create db.Create (& Product Code: "L1212", Prijs: 1000) // Lees var product Product db.First (& product, 1) // vind product met id 1 db.First (& product, "code =? "," L1212 ") // Update - prijs van het product updaten naar 2000 db.Model (& product) .Update (" Prijs ", 2000) // Wissen - verwijder product db.Wissen (& product)

6. Gans

Een van de belangrijkste taken bij het werken met relationele databases is het beheren van het schema. Het aanpassen van het DB-schema wordt in sommige organisaties als een "enge" verandering beschouwd. Met het ganzenpakket kunt u indien nodig schemawijzigingen en zelfs gegevensmigraties uitvoeren. Jij kan ganzenveren en ganzendons om heen en weer te gaan. Let echter op uw gegevens en zorg ervoor dat deze niet verloren gaan of beschadigd raken.

Goose werkt door het versiebeheer van uw schema en het gebruik van migratiebestanden die overeenkomen met elk schema. De migratiebestanden kunnen SQL-opdrachten of Go-opdrachten zijn. Hier is een voorbeeld van een SQL-migratiebestand dat een nieuwe tabel toevoegt:

-- +goose Up CREATE TABLE persoon (id int NOT NULL, naamtekst, age int, PRIMARY KEY (id)); - + goose Down DROP TABLE persoon;

De -- +ganzenveren en -- +ganzendons opmerkingen vertellen ganzen wat ze moeten doen om het schema te upgraden of te downgraden.

7. Glijden

Glide is een pakketbeheerder voor Go. Onder een single GOPATH, je hebt misschien veel programma's die tegenstrijdige afhankelijkheden hebben. De oplossing is om elk programma zijn eigen leveranciersdirectory van pakketafhankelijkheden te laten beheren. Glide helpt met deze taak.

Dit zijn de kenmerken van glijden:

  • Ondersteuning van versiebeheerpakketten inclusief ondersteuning voor Semantic Versioning 2.0.0.
  • Ondersteuning van aliasing-pakketten (bijvoorbeeld voor het werken met github-vorken).
  • Verwijder de noodzaak om importinstructies te munderen.
  • Werk met alle go-tools.
  • Ondersteuning van alle VCS-tools die Go ondersteunt (git, bzr, hg, svn).
  • Ondersteuning van lokale en wereldwijde plug-ins.
  • Repository caching en data caching voor verbeterde prestaties.
  • Platte afhankelijkheden, het oplossen van versieverschillen en het vermijden van het meerdere keren opnemen van een pakket.
  • Beheer en installeer afhankelijkheden on-demand of verkocht in uw versiecontrolesysteem. 

De afhankelijkheden worden opgeslagen in glide.yaml, en glide biedt verschillende opdrachten om afhankelijkheden te beheren:

 create, init Initialiseer een nieuw project, maak een glide.yaml-configuratie-wizard, cw Wizard die optionele suggesties doet om de config in een glide.yaml-bestand te verbeteren. krijg Installeer een of meer pakketten in 'vendor /' en voeg afhankelijkheid toe aan glide.yaml. remove, rm Verwijder een pakket uit het bestand glide.yaml en regenereer het vergrendelingsbestand. import Importeer bestanden van andere afhankelijkheidsbeheersystemen. naam Druk de naam van dit project af. novendor, nv Lijst met alle niet-leverancierpaden in een map. opnieuw opbouwen Rebuild ('go build') de afhankelijkheden installeren, i Installeer de afhankelijkheden-update van een project, up Update de afhankelijkhedenboom van een project (Verouderd) Boom drukt de afhankelijkheden van dit project af als een boom. lijst Lijst drukt alle afhankelijkheden af ​​die de huidige code verwijst. info Info print informatie over dit project cache-vrij, cc Wist de cache van Glide. about Informatie over Glide mirror Hulp mirrors Help, h Geeft een lijst met opdrachten of hulp voor één opdracht weer

8. Ginkgo

Ginkgo is een BDD-testkader (Behavior Driven Development). Hiermee kunt u uw tests schrijven in een syntaxis die op Engels lijkt en minder technische mensen toestaat om tests (en hun uitvoer) te controleren en te controleren of ze voldoen aan de zakelijke vereisten. 

Sommige ontwikkelaars houden ook van deze stijl van testspecificatie. Het integreert met het ingebouwde testpakket van Go en wordt vaak gecombineerd met Gomega. Hier is een voorbeeld van een Ginkgo + Gomega-test:

actual, err: = foo () Ω (err) .Zou (BeNil ()) Ω (actueel) .ShouldNot (BeNil ()) Ω (feitelijk resultaat) .Should (Equal (100))

9. Etcd

Etcd is een betrouwbare verdeelde Key-Value-winkel. De server is geïmplementeerd in Go en de Go-client communiceert ermee via gRPC.

Het richt zich op het volgende:

  • Eenvoudig: goed gedefinieerde, gebruikersgerichte API (gRPC).
  • Veilig: automatische TLS met optionele client cert-authenticatie.
  • Snel: benchmarking van 10.000 schrijfacties / sec.
  • Betrouwbaar: correct verdeeld met Raft.

Hier is een voorbeeld van verbinding maken met de server, waarde toevoegen en verkrijgen, inclusief time-outs en opruimen.

func test_get () cli, err: = clientv3.New (clientv3.Config Endpoints: endpoints, DialTimeout: dialTimeout,) if err! = nil log.Fatal (err) uitstellen cli.Close () _, err = cli.Put (context.TODO (), "foo", "bar") if err! = nil log.Fatal (err) ctx, cancel: = context.WithTimeout (context.Background (), requestTimeout) resp , err: = cli.Get (ctx, "foo") cancel () if err! = nil log.Fatal (err) voor _, ev: = range resp.Kvs fmt.Printf ("% s:% s \ n ", ev.Key, ev.Value) // Uitvoer: foo: balk

10. NSQ

NSQ is een geweldige gedistribueerde wachtrij. Ik heb het met succes gebruikt als een primaire bouwsteen voor grootschalige gedistribueerde systemen. Hier zijn enkele van de functies:

  • Ondersteunde gedistribueerde topologieën zonder SPOF.
  • Horizontaal schaalbaar (geen makelaars, voeg naadloos meerdere knooppunten toe aan het cluster).
  • Op low-latency push-gebaseerde berichtaflevering (uitvoering).
  • Message-routing in combinatie met load-balanced en multicast-stijl.
  • Excel op zowel streaming (high-throughput) als jobgeoriënteerde (low-throughput) werkbelastingen.
  • Hoofdzakelijk in het geheugen (boven een high-water mark-berichten worden transparant op schijf bewaard).
  • Runtime-detectieservice voor consumenten om producenten te vinden (nsqlookupd).
  • Transportlaagbeveiliging (TLS).
  • Gegevensformaat agnostisch.
  • Weinig afhankelijkheden (eenvoudig in te zetten) en een normale, begrensde, standaardconfiguratie.
  • Eenvoudig TCP-protocol ondersteunt clientbibliotheken in elke taal.
  • HTTP-interface voor statistieken, beheerdersacties en producenten (er was geen bibliotheek voor de client nodig om te publiceren).
  • Integreert met statsd voor realtime instrumentatie.
  • Robuuste clusterbeheerinterface (nsqadmin).

Hier leest u hoe u een bericht kunt publiceren naar NSQ (foutafhandeling is verholpen):

pakket main import ("github.com/bitly/go-nsq") func main () config: = nsq.NewConfig () p, _: = nsq.NewProducer ("127.0.0.1:4150", config) p. Publiceren ("onderwerp", [] byte ("bericht")) p.Stop ()

En hier is hoe te consumeren:

pakket 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 (message * nsq.Message) error fmt.Printf ("Got a message:% v", bericht) wg.Done () return nil) q.AddHandler (handler) q.ConnectToNSQD ("127.0.0.1:4150") wg.Wait ()

11. Docker

Docker is nu een begrip (als uw gezinsleden meestal DevOps-mensen zijn). U bent zich mogelijk niet bewust dat Docker is geïmplementeerd in Go. Normaal gesproken gebruik je Docker niet in je code, maar het is een belangrijk project en het verdient het te worden herkend als een enorm succesvol en populair Go-project.

12. Kubernetes

Kubernetes is een open-source container-orkestratieplatform voor cloud-native applicaties. Het is een ander monster gedistribueerd systeem geïmplementeerd in Go. Ik heb onlangs een boek geschreven met de titel Mastering Kubernetes waarin ik uitvoerig inga op de meest geavanceerde aspecten van Kubernetes. Vanuit het oogpunt van de Go-ontwikkelaar is Kubernetes erg flexibel en kun je het uitbreiden en aanpassen via plug-ins.

Conclusie

Go is een geweldige taal. Zijn ontwerpfilosofie is om een ​​eenvoudige en aanspreekbare taal te zijn. De standaardbibliotheek is niet zo uitgebreid als sommige andere talen, zoals Python. 

De Go-community is een stap verder gegaan en er zijn veel hoogwaardige bibliotheken die u in uw programma's kunt gebruiken. In dit artikel heb ik 12 bibliotheken geïntroduceerd. Ik moedig je aan om naar andere bibliotheken te zoeken voordat je erin springt en alles vanaf het begin implementeert.