12 paquets et bibliothèques indispensables

Go est une langue étonnante et dynamique qui met l’accent sur la simplicité. Cette approche est évidente dans sa bibliothèque standard, qui fournit tous les éléments essentiels, mais pas beaucoup plus.. 

Heureusement, Go possède une communauté dynamique qui crée et partage de nombreuses bibliothèques tierces. Dans ce tutoriel, je vais vous présenter 12 des meilleurs packages et bibliothèques de Go. Certains d'entre eux ont une portée relativement étroite et peuvent être ajoutés à n'importe quel projet, tandis que d'autres sont d'énormes projets que vous pouvez intégrer à d'énormes systèmes distribués à grande échelle..

Génial aller

Avant de plonger dans les bibliothèques elles-mêmes, laissez-moi vous présenter Awesome Go, une liste très active et bien organisée de bibliothèques Go et d’autres ressources. Vous devriez visiter de temps en temps et vérifier les nouveautés.

1. Jeu de Golang

Go contient des tableaux, des tranches et des cartes, mais aucune structure de données n'est définie. Vous pouvez imiter un ensemble avec une carte de bools, mais il est bien d’avoir un type de données réel avec les opérations et la sémantique appropriées. C'est ici qu'intervient golang-set. Voici un exemple élémentaire de création d'un nouvel ensemble, d'ajout d'éléments et de test d'adhésion:

package principal d'importation ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Rouge") basicColors.Add ("Bleu") basicColors. Ajoutez ("Vert") si basicColors.Contains ("Vert") fmt.Println ("Yay! 'Green' est une couleur de base") else fmt.Println ("Quelle déception! 'Green' n'est pas un couleur de base ") if basicColors.Contains (" Yellow ") fmt.Println (" Yay! 'Yellow' est une couleur de base ") else fmt.Println (" Quelle déception! 'Yellow' n'est pas une base color ") Sortie: Yay! Le «vert» est une couleur de base Quelle déception! 'Jaune' n'est pas une couleur de base

Notez que le nom du paquet est "mapset". Outre les bases, vous effectuez toutes les opérations définies telles que l'union, l'intersection et la différence. Vous pouvez également parcourir les valeurs définies: 

package principal d'importation ("fmt" "github.com/deckarep/golang-set") func main () basicColors: = mapset.NewSet () basicColors.Add ("Rouge") basicColors.Add ("Bleu") basicColors. Ajoutez ("Vert") otherColors: = mapset.NewSetFromSlice ([] interface  "Orange", "Jaune", "Indigo", "Violet") rainbowColors: = basicColors.Union (otherColors) pour color: = range rainbowColors.Iterator (). C fmt.Println (color)

2. couleur

Continuons avec le thème de la couleur. Lors de l’écriture de programmes en ligne de commande, il est utile d’utiliser des couleurs pour mettre en évidence les messages importants ou faire la distinction entre les erreurs, les succès et les avertissements.. 

Le paquet de couleurs offre un moyen facile d'ajouter de la couleur à vos programmes (voyez ce que j'ai fait là-bas?). Il utilise les codes d'échappement ANSII et prend également en charge Windows! Voici un exemple rapide:

package principal import ("github.com/fatih/color") func main () color.Red ("Les roses sont rouges") color.Blue ("Les violettes sont bleues") 

L'ensemble de couleurs prend en charge le mélange des couleurs avec les couleurs d'arrière-plan, des styles tels que gras ou italique, et l'aspersion de couleurs avec une sortie non couleur.

package principal d'importation ("github.com/fatih/color" "fmt") func main () minion: = color.New (color.FgBlack) .Add (color.BgYellow) .Add (color.Bold) minion.Println ("Minion dit: banane !!!!!!") m: = minion.PrintlnFunc () m ("Je veux une autre banane !!!!!") inclinéRouge: = couleur.Nouveau (couleur.FgRouge, couleur.BgWhite , color.Italic) .SprintFunc () fmt.Println ("J'ai fait un énorme", slantedRed ("error")) 

Le paquet de couleur a d'autres fonctionnalités utiles. Allez-y et explorez plus.

3. maintenant

Maintenant, un paquet très simple fournit un wrapper de commodité pour le paquet d'heure standard et facilite le travail avec diverses constructions de date et d'heure autour de l'heure actuelle.. 

Par exemple, vous pouvez obtenir le début de la minute actuelle ou la fin du dimanche le plus proche de l'heure actuelle. Voici comment utiliser "maintenant":

package principal import ("github.com/jinzhu/now" "fmt") func main () fmt.Println ("Tous les débuts…") fmt.Println (now.BeginningOfMinute ()) fmt.Println (now.BeginningOfHour ()) fmt.Println (now.BeginningOfDay ()) fmt.Println (now.BeginningOfWeek ()) fmt. ()) Sortie: Tous les débuts… 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 TVP 

Vous pouvez également analyser les temps et même ajouter vos propres formats (ce qui nécessitera la mise à jour des formats connus). le À présent type embarque temps temps, afin que vous puissiez utiliser tous les temps temps méthodes directement sur À présent objets.

4. Gen

L'outil gen génère du code pour vous, en particulier, du code sensible au type qui tente de réduire l'écart entre les modèles et les génériques dans Go..

Vous annotez vos types avec un commentaire spécial et gen génère des fichiers source que vous incluez dans votre projet. Pas de magie d'exécution. Voyons un exemple. Voici un type annoté.

// + gen slice: "Où, Nombre, GroupBy [int]" type personne struct Nom chaîne Age int 

Fonctionnement gen (assurez-vous que c'est dans votre chemin) génère person_slice.go:

// Généré par: gen // TypeWriter: slice // Directive: + gen on package principal Person // PersonSlice est une tranche de type Person. Utilisez-le là où vous utiliseriez [] Personne. type PersonSlice [] Person // Where renvoie un nouveau PersonSlice dont les éléments ont la valeur true pour func. Voir: http://clipperhouse.github.io/gen/#Where func (rcv PersonSlice) Où (fn func (Personne) bool) (résultat PersonSlice) pour _, v: = plage rcv si fn (v)  result = append (result, v) return result // Count donne le nombre d'éléments de PersonSlice qui retournent la valeur true pour la fonction transmise. Voir: http://clipperhouse.github.io/gen/#Count func (rcv PersonSlice) Nombre (fn func (Personne) bool) (résultat int) pour _, v: = plage rcv si fn (v)  result ++ return // GroupByInt regroupe les éléments dans une mappe indexée par int. Voir: http://clipperhouse.github.io/gen/#GroupBy func (rcv PersonSlice) GroupByInt (fn func (Personne) int) map [int] PersonSlice résultat: = make (map [int] PersonSlice) pour _, v: = plage rcv clé: = fn (v) résultat [clé] = append (résultat [clé], v) résultat renvoyé 

Le code fournit des méthodes de type LINQ pour fonctionner sur le PersonSlice type. C'est simple à comprendre et bien documenté. 

Voici comment vous l'utilisez. Dans la fonction principale, un PersonSlice est défini. le âge() fonction sélectionne le champ d'âge de son La personne argument. Le généré GroupByInt () la fonction prend la âge() fonctionne et renvoie les personnes de la tranche regroupées par âge (34 correspond à Jim, mais 23 à Jane et Kyle).

package main import ("fmt") // tranche + gen: "Où, Nombre, GroupBy [int]" type personne Structure Nom chaîne Age func age (p Personne) int return p.Age func main () people: = PersonSlice "Jim", 34, "Jane", 23, "Kyle", 23, groupedByAge: = people.GroupByInt (age) fmt.Println (groupedByAge) Sortie: carte [34: [Jim 34] 23: [Jane 23 Kyle 23]]

5. Gorm

Go est connu pour sa nature spartiate. La programmation de base de données n'est pas différente. Les bibliothèques de base de données les plus populaires pour Go sont plutôt de bas niveau. Gorm apporte le monde de la cartographie relationnelle objet à Go avec les fonctionnalités suivantes:

  • Associations (a une, a beaucoup, appartient à, beaucoup à beaucoup, polymorphisme)
  • Rappels (avant / après création / sauvegarde / mise à jour / suppression / recherche)
  • Préchargement (chargement rapide)
  • Transactions
  • Clé primaire composite
  • Constructeur SQL
  • Migrations automatiques
  • Enregistreur
  • Extensible, écrire des plugins basés sur des rappels GORM

Mais ça ne couvre pas tout. Si vous venez de Python, ne vous attendez pas à la magie SQLAlchemy. Pour des choses plus sophistiquées, vous devrez passer à un niveau inférieur. Voici un exemple d'utilisation de Gorm avec sqlite. Noter l'embarqué gorm.Modèle dans la structure du produit.

package principal import ("github.com/jinzhu/gorm" _ "" github.com/jinzhu/gorm/dialects/sqlite ") type Structure du produit gorm.Modèle Code chaîne Prix Prix uint func principal () db, err: = gorm.Open ("sqlite3", "test.db") si err! = nil panic ("échec de la connexion à la base de données") différer db.Close () // Migration du schéma db.AutoMigrate (& Product ) / / Create db.Create (& Produit Code: "L1212", Prix: 1000) // Lire le produit var Produit db.First (& produit, 1) // recherche le produit avec l'ID 1 db.First (& produit, "code =? "," L1212 ") // Update - met à jour le prix du produit à 2000 db.Model (& product) .Update (" Price ", 2000) // Delete - supprime le produit db.Delete (& product)

6. oie

L'une des tâches les plus importantes lors de l'utilisation de bases de données relationnelles est la gestion du schéma. La modification du schéma de base de données est considérée comme un changement "effrayant" dans certaines organisations. Le package goose vous permet d'effectuer des modifications de schéma et même des migrations de données si nécessaire. Vous pouvez haut d'oie et duvet d'oie aller et venir. Attention à vos données, cependant, et assurez-vous qu'elles ne soient ni perdues ni corrompues.

Goose fonctionne en versionnant votre schéma et en utilisant les fichiers de migration correspondant à chaque schéma. Les fichiers de migration peuvent être des commandes SQL ou des commandes Go. Voici un exemple de fichier de migration SQL qui ajoute une nouvelle table:

-- +goose Up CREATE TABLE personne (id int NOT NULL, nom du texte, age int, PRIMARY KEY (id)); - + duvet d'oie DROP TABLE personne;

le -- +haut d'oie et -- +duvet d'oie les commentaires indiquent à goose ce qu'il faut faire pour mettre à niveau ou rétrograder le schéma.

7. Glide

Glide est un gestionnaire de paquets pour Go. Sous un seul GOPATH, de nombreux programmes peuvent avoir des dépendances en conflit. La solution consiste à faire en sorte que chaque programme gère son propre répertoire de fournisseurs de dépendances de packages. Glide aide dans cette tâche.

Voici les caractéristiques de la glisse:

  • Prend en charge les packages de contrôle de version, y compris le support de Semantic Versioning 2.0.0.
  • Prend en charge les alias de paquets (par exemple, pour utiliser des fourches github).
  • Supprimez la nécessité de regrouper les instructions d'importation.
  • Travailler avec tous les outils de go.
  • Prise en charge de tous les outils VCS pris en charge par Go (git, bzr, hg, svn).
  • Supporte les plugins locaux et globaux personnalisés.
  • Mise en cache du référentiel et mise en cache des données pour améliorer les performances.
  • Aplatir les dépendances, en résolvant les différences de version et en évitant l'inclusion d'un package à plusieurs reprises.
  • Gérez et installez des dépendances à la demande ou vendorées dans votre système de contrôle de version.. 

Les dépendances sont stockées dans glide.yaml, and glide fournit plusieurs commandes pour gérer les dépendances:

 create, init Initialise un nouveau projet en créant un fichier glide.yaml config-wizard, cw Assistant qui propose des suggestions facultatives pour améliorer la configuration dans un fichier glide.yaml. get Installez un ou plusieurs packages dans 'vendor /' et ajoutez une dépendance à glide.yaml. remove, rm Supprime un package du fichier glide.yaml et régénère le fichier verrou. importer Fichiers d'importation provenant d'autres systèmes de gestion des dépendances. nom Affiche le nom de ce projet. novendor, nv Liste tous les chemins non-fournisseurs d'un répertoire. reconstruire Reconstruire («construire») les dépendances installer, i Installer la mise à jour des dépendances d'un projet, monter Mettre à jour l'arborescence des dépendances d'un projet (obsolète) L'arborescence imprime les dépendances de ce projet sous la forme d'une arborescence. list La liste imprime toutes les dépendances auxquelles le code actuel fait référence. info Info imprime des informations sur ce projet cache-clear, cc Efface le cache Glide. à propos de En savoir plus sur Glide mirror Gérer l'aide des miroirs, h Affiche une liste de commandes ou l'aide correspondant à une commande.

8. Ginkgo

Ginkgo est un framework de test BDD (Behavior Driven Development). Il vous permet d’écrire vos tests dans une syntaxe similaire à celle de l’anglais et de permettre à des techniciens moins techniques de passer en revue les tests (et leur sortie) et de vérifier qu’ils répondent aux exigences de l’entreprise.. 

Certains développeurs aiment aussi ce style de spécification de test. Il s'intègre au package de test intégré de Go et est souvent associé à Gomega. Voici un exemple de test Ginkgo + Gomega:

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

9. Etcd

Etcd est un magasin Key-Value distribué et fiable. Le serveur est implémenté dans Go, et le client Go interagit avec lui via gRPC..

Il se concentre sur les éléments suivants:

  • Simple: API utilisateur bien définie (gRPC).
  • Sécurisé: TLS automatique avec authentification de client en option.
  • Rapide: 10 000 écritures par seconde.
  • Fiable: correctement distribué à l'aide de Raft.

Voici un exemple de connexion au serveur, de définition d’une valeur et d’obtention de cette valeur, y compris les délais et le nettoyage..

func test_get () cli, err: = clientv3.New (clientv3.Config Points finaux: points finaux, DialTimeout: dialTimeout,) si err! = nil log.Fatal (erreur) diffère de cli.Close () _, erreur = cli.Put (context.TODO (), "foo", "bar") si err! = nil log.Fatal (erreur) ctx, cancel: = context.WithTimeout (context.Background (), requestTimeout) resp , err: = cli.Get (ctx, "foo") cancel () si err! = nil log.Fatal (err) pour _, ev: = intervalle resp.Kvs fmt.Printf ("% s:% s \ n ", ev.Key, ev.valeur) // Sortie: foo: bar

10. NSQ

NSQ est une excellente file d'attente distribuée. Je l'ai utilisé avec succès comme bloc de construction principal pour les systèmes distribués à grande échelle. Voici certaines de ses caractéristiques:

  • Prise en charge des topologies distribuées sans SPOF.
  • Évolutif horizontalement (pas de courtier, ajoutez de manière transparente plus de nœuds au cluster).
  • Diffusion de messages basée sur une latence faible (performances).
  • Combinaison de routage de messages de type multidiffusion et à charge équilibrée.
  • Excel pour les charges de travail en continu (haut débit) et orientées travail (faible débit).
  • Principalement en mémoire (au-delà d'une marque de marée haute, les messages sont conservés de manière transparente sur le disque).
  • Service de découverte à l'exécution permettant aux consommateurs de trouver des producteurs (nsqlookupd).
  • Sécurité de la couche de transport (TLS).
  • Format de données agnostique.
  • Peu de dépendances (faciles à déployer) et une configuration par défaut saine, bornée.
  • Protocole TCP simple prenant en charge les bibliothèques clientes dans toutes les langues.
  • Interface HTTP pour les statistiques, les actions d'administration et les producteurs (aucune bibliothèque cliente nécessaire à la publication).
  • S'intègre à statsd pour une instrumentation en temps réel.
  • Interface d'administration de cluster robuste (nsqadmin).

Voici comment publier un message sur NSQ (la gestion des erreurs est supprimée):

package main import ("github.com/bitly/go-nsq") func main () config: = nsq.NewConfig () p, _: = nsq.NewProducer ("127.0.0.1:4150", config) p. Publier ("sujet", [] octet ("message")) p.Stop ()

Et voici comment consommer:

package principal d'importation ("sync" "fmt" "github.com/bitly/go-nsq") func main () wg: = & sync.WaitGroup  wg.Add (1) config: = nsq.NewConfig () q , _: = nsq.NewConsumer ("topic", "channel", config) gestionnaire: = nsq.HandlerFunc (func (message * nsq.Message) error fmt.Printf ("Vous avez reçu un message:% v", message) wg.Done () return nil) q.AddHandler (gestionnaire) q.ConnectToNSQD ("127.0.0.1:4150") wg.Wait ()

11. Docker

Docker est un nom familier maintenant (si les membres de votre famille sont principalement des personnes de DevOps). Vous n'êtes peut-être pas au courant que Docker est implémenté dans Go. Vous n'utilisez généralement pas Docker dans votre code, mais il s'agit d'un projet important qui mérite d'être reconnu comme un projet Go extrêmement populaire et populaire..

12. Kubernetes

Kubernetes est une plate-forme d'orchestration de conteneur open-source pour les applications natives en nuage. C'est un autre système distribué par monstre implémenté dans Go. J'ai récemment écrit un livre intitulé Mastering Kubernetes, dans lequel je décris en détail les aspects les plus avancés de Kubernetes. Du point de vue du développeur Go, Kubernetes est très flexible et vous pouvez l'étendre et le personnaliser via des plugins..

Conclusion

Go est une excellente langue. Sa philosophie de conception est d'être une langue simple et accessible. Sa bibliothèque standard n’est pas aussi complète que d’autres langages comme Python.. 

La communauté Go s'est intensifiée et de nombreuses bibliothèques de haute qualité peuvent être utilisées dans vos programmes. Dans cet article, j'ai introduit 12 bibliothèques. Je vous encourage à rechercher d'autres bibliothèques avant de vous lancer et de tout mettre en œuvre à partir de zéro..