Comment écrire des packages Go

Un package Go se compose de fichiers Go situĂ©s dans le mĂȘme rĂ©pertoire, au dĂ©but desquels se trouve la mĂȘme expression de package . Les packages qui se connectent aux programmes vous permettent d'Ă©tendre leurs capacitĂ©s. Certains packages font partie de la bibliothĂšque Go standard. Cela signifie que si vous utilisez Go, ils sont dĂ©jĂ  installĂ©s. D'autres packages sont installĂ©s Ă  l'aide de la commande go get . Vous pouvez Ă©galement Ă©crire vos propres Go-packages, crĂ©er des fichiers dans des rĂ©pertoires spĂ©ciaux et respecter les rĂšgles de conception des packages.



Le matĂ©riel, dont nous publions la traduction aujourd'hui, est un guide pour le dĂ©veloppement de Go-packages pouvant ĂȘtre connectĂ©s Ă  d'autres fichiers.

Prérequis


  • Configurez votre environnement logiciel Go (dĂ©couvrez comment procĂ©der ici ). CrĂ©ez un espace de travail Go (le cinquiĂšme point du matĂ©riel ci-dessus lui est dĂ©diĂ©). Dans la section suivante de ce document, vous trouverez des exemples dont la reproduction est recommandĂ©e Ă  la maison. Vous pouvez donc mieux y faire face.
  • Pour approfondir vos connaissances sur GOPATH - jetez un Ɠil Ă  ce matĂ©riel.

Écriture et importation de packages


L'Ă©criture de code de package est identique Ă  l'Ă©criture de code Go standard. Les packages peuvent contenir des dĂ©clarations de fonctions, de types et de variables, qui peuvent ensuite ĂȘtre utilisĂ©es dans d'autres programmes Go.

Avant de commencer Ă  crĂ©er un nouveau package, nous devons accĂ©der Ă  l'espace de travail Go. Il est situĂ© sur le chemin spĂ©cifiĂ© par la variable GOPATH . Par exemple, que notre organisation s'appelle gopherguides . En mĂȘme temps, nous, en tant que rĂ©fĂ©rentiel, utilisons GitHub . Cela conduit au fait que, le long du chemin spĂ©cifiĂ© par GOPATH , nous avons la structure de dossiers suivante:

 └── $GOPATH    └── src        └── github.com            └── gopherguides 

Nous allons nommer le package que nous développerons dans ce guide, greet . Pour ce faire, créez le répertoire d' greet dans le répertoire gopherguides . Par conséquent, la structure de dossiers existante prendra la forme suivante:

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet 

Nous sommes maintenant prĂȘts Ă  ajouter le premier fichier au rĂ©pertoire d' greet . En rĂšgle gĂ©nĂ©rale, un fichier qui est le point d'entrĂ©e d'un package est appelĂ© de la mĂȘme maniĂšre que le rĂ©pertoire du package. Dans ce cas, cela signifie que nous, dans le rĂ©pertoire d' greet , crĂ©ons le greet.go :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── greet                    └── greet.go 

Dans ce fichier, nous pouvons écrire du code que nous voulons réutiliser dans nos projets. Dans ce cas, nous allons créer la fonction Hello , qui affiche le texte Hello, World! .

Ouvrez le fichier greet.go dans un éditeur de texte et ajoutez-y le code suivant:

 package greet import "fmt" func Hello() {    fmt.Println("Hello, World!") } 

Analysons le contenu de ce fichier. La premiÚre ligne de chaque fichier doit contenir le nom du package dans lequel nous travaillons. Puisque nous sommes dans le package greet , le mot-clé package est utilisé ici, suivi du nom du package:

 package greet 

Cela indique au compilateur d'accepter tout ce qui se trouve dans le fichier dans le cadre du package d' greet .

Ensuite, les packages nécessaires sont importés à l'aide de l'instruction import . Dans ce cas, nous n'avons besoin que d'un seul paquet - fmt :

 import "fmt" 

Et enfin, nous créons la fonction Hello . Elle utilisera les capacités du package fmt pour afficher la chaßne Hello, World! :

 func Hello() {    fmt.Println("Hello, World!") } 

Maintenant, aprÚs la création du package d' greet , vous pouvez l'utiliser dans n'importe quel autre package. Créons un nouveau package dans lequel nous utiliserons le package de greet .

À savoir, nous allons crĂ©er un example package. Pour ce faire, nous partirons des mĂȘmes hypothĂšses Ă  partir desquelles nous avons procĂ©dĂ©, en crĂ©ant le package de greet . Commencez par crĂ©er l' example dossier dans le dossier gopherguides :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                    └── example 

CrĂ©ez maintenant un fichier qui est le point d'entrĂ©e du package. Nous considĂ©rons ce package comme un programme exĂ©cutable et non comme un package dont le code devrait ĂȘtre utilisĂ© dans d'autres packages. Les fichiers qui sont les points d'entrĂ©e des programmes sont gĂ©nĂ©ralement appelĂ©s main.go :

 └── $GOPATH    └── src        └── github.com            └── gopherguides                └── example                    └── main.go 

Ouvrez le fichier main.go dans l'éditeur et main.go code suivant, qui vous permet d'utiliser les capacités du package de greet :

 package main import "github.com/gopherguides/greet" func main() {    greet.Hello() } 

Nous avons importé le package de main.go dans le fichier main.go , ce qui signifie que pour appeler la fonction déclarée dans ce package, nous devons utiliser la notation par points. Une notation par points est une construction dans laquelle un point est placé entre le nom du package et le nom de la ressource de ce package à utiliser. Par exemple, dans le package d' greet , la fonction Hello joue le rÎle d'une ressource. Si vous devez appeler cette fonction, la notation par points est utilisée : greet.Hello() .

Vous pouvez maintenant ouvrir le terminal et exécuter le programme:

 go run main.go 

AprÚs cela, le terminal affichera les éléments suivants:

 Hello, World! 

Voyons maintenant comment utiliser les variables déclarées dans les packages. Pour ce faire, ajoutez la déclaration de variable au greet.go :

 package greet import "fmt" var Shark = "Sammy" func Hello() {    fmt.Println("Hello, World!") } 

Ouvrez le fichier main.go et ajoutez-y une ligne oĂč la fonction fmt.Println() est utilisĂ©e pour afficher la valeur de la variable Shark dĂ©clarĂ©e dans le greet.go . À savoir, main.go sous la forme suivante:

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark) } 

Exécutez à nouveau le programme:

 go run main.go 

Maintenant, elle affichera les éléments suivants:

 Hello, World! Sammy 

Voyons maintenant comment déclarer des types dans des packages. Créez un type Octopus avec les champs Name et Color et créez une méthode de type. Cette méthode, lorsqu'elle est appelée, renvoie le contenu spécialement traité des champs Octopus . greet.go au formulaire suivant:

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func Hello() {    fmt.Println("Hello, World!") } 

Maintenant, ouvrez main.go , créez une instance de la structure du nouveau type et référez-vous à sa méthode String() :

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String()) } 

AprĂšs avoir créé une instance d' Octopus aide d'une construction qui ressemble Ă  oct := greet.Octopus , vous pouvez accĂ©der aux mĂ©thodes et propriĂ©tĂ©s du type Ă  partir de l' main.go fichier main.go Cela, en particulier, vous permet d'utiliser la commande oct.String() situĂ©e Ă  la fin du fichier main.go sans recourir Ă  greet . De plus, on peut, par exemple, se rĂ©fĂ©rer au champ de la structure Color utilisant la construction oct.Color . En mĂȘme temps, comme lorsque nous avons appelĂ© la mĂ©thode, nous n'accĂ©dons pas au message d' greet .

La méthode String du type Octopus utilise la fonction fmt.Sprintf pour former la phrase et renvoie, en utilisant return , le résultat, la chaßne, à l'appel de méthode (dans ce cas, cet endroit se trouve dans main.go ).

Exécutez à nouveau le programme:

 go run main.go 

Il affichera les éléments suivants sur la console:

 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange. 

Maintenant que nous avons Ă©quipĂ© Octopus de la mĂ©thode String , nous avons un mĂ©canisme de sortie d'informations de type adaptĂ© Ă  la rĂ©utilisation. Si Ă  l'avenir vous devez changer le comportement de cette mĂ©thode, qui peut ĂȘtre utilisĂ©e dans de nombreux projets, il suffira d'Ă©diter une fois son code greet.go .

Exportation d'entité


Vous avez peut-ĂȘtre remarquĂ© que tout ce que nous avons travaillĂ© lors de l'accĂšs au package d' greet a des noms qui commencent par une majuscule. Go n'a pas de modificateurs d'accĂšs comme public , private ou protected , qui sont dans d'autres langues. La visibilitĂ© des entitĂ©s pour les mĂ©canismes externes est contrĂŽlĂ©e par le fait par quelle lettre, avec une petite ou une grande, commence leur nom. Par consĂ©quent, les types, variables, fonctions dont les noms commencent par une majuscule sont disponibles en dehors du package actuel. Le code visible en dehors du package est appelĂ© exportĂ©.

Si vous Ă©quipez le type Octopus d'une nouvelle mĂ©thode appelĂ©e reset , cette mĂ©thode peut ĂȘtre appelĂ©e Ă  partir du package de main.go , mais pas Ă  partir du fichier main.go , qui est en dehors du package de main.go . Voici une version mise Ă  jour greet.go :

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 

Essayons d'appeler reset depuis le fichier main.go :

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.reset() } 

Cela entraĂźnera l'erreur de compilation suivante:

 oct.reset undefined (cannot refer to unexported field or method greet.Octopus.reset) 

Pour exporter la méthode de reset Octopus , vous devez la renommer en remplaçant la premiÚre lettre, minuscule r , par une majuscule R Pour ce faire, nous greet.go :

 package greet import "fmt" var Shark = "Sammy" type Octopus struct {    Name string    Color string } func (o Octopus) String() string {    return fmt.Sprintf("The octopus's name is %q and is the color %s.", o.Name, o.Color) } func (o Octopus) Reset() {    o.Name = ""    o.Color = "" } func Hello() {    fmt.Println("Hello, World!") } 

Cela conduira au fait que nous pourrons appeler Reset partir d'autres packages et sans rencontrer de messages d'erreur:

 package main import (    "fmt"    "github.com/gopherguides/greet" ) func main() {    greet.Hello()    fmt.Println(greet.Shark)    oct := greet.Octopus{        Name: "Jesse",        Color: "orange",    }    fmt.Println(oct.String())    oct.Reset()    fmt.Println(oct.String()) } 

Exécutez le programme:

 go run main.go 

Voici ce qui arrive Ă  la console:

 Hello, World! Sammy The octopus's name is "Jesse" and is the color orange The octopus's name is "" and is the color . 

En appelant la mĂ©thode Reset , nous avons effacĂ© les champs Name et Color de notre instance Octopus . Par consĂ©quent, lorsque vous appelez String , oĂč le contenu des champs Name et Color Ă©tait prĂ©cĂ©demment affichĂ©, rien ne s'affiche dĂ©sormais.

Résumé


L'Ă©criture de packages Go n'est pas diffĂ©rente de l'Ă©criture de code Go standard. Cependant, placer le code du package dans leurs propres rĂ©pertoires permet d'isoler le code, qui peut ĂȘtre utilisĂ© dans n'importe quel autre projet Go. Ici, nous avons parlĂ© de la façon de dĂ©clarer des fonctions, des variables et des types dans des packages, examinĂ© comment utiliser ces entitĂ©s en dehors des packages et trouvĂ© oĂč stocker les packages conçus pour leur utilisation rĂ©pĂ©tĂ©e.

Chers lecteurs! Quels programmes écrivez-vous habituellement sur Go? Utilisez-vous des packages propriétaires?

Source: https://habr.com/ru/post/fr464289/


All Articles