Logo marque du langage Go

Concept de base : Packages – Import

Nous allons ici aborder un concept fondamentale de GO : les Packages et en particulier leurs imports au sein de nos programmes.

Comme nous l’avons vu dans le billet précédent concernant la définition des packages , ce concept est très important dans la conception d’application et dans le cadre d’une bonne pratique. On parle aussi du principe DRY – Don’t Repeat Yourself, mais on reparlera plus tard de ce principe.

De manière générale il faut pouvoir réutiliser nos packages mais aussi ceux fournis dans la librairie de base ou toutes autres librairies tiers.

Exemple

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello, playground")
}

Dans notre exemple, nous demandons à GO d’importer le package fmt, Ce package contient un ensemble de fonctions en rapport avec l’affichage et le formatage à l’écran. Grâce à cette approche de package cela va permettre la réutilisation dans n’importe quelle autre programme, application ou package. De plus, pour accéder à une fonction contenu dans ce package, on utilisera la notation à point. On préfixera avec le nom du package et ensuite le point et pour finir le nom de la fonction dans notre cas.

Avantages

  • Lors de la compilation ce ne seront que les parties de code qui ont évoluées qui seront recompilées d’où un gain de temps non négligeables sur de grandes applications ;
  • La création de package permet d’avoir une meilleure organisation de son code et de se faite de retrouver plus facilement des fonctions ou autres parties de code. On peut imaginer avoir un package qui ne s’occupe que des requêtes HTTP et un autre des requêtes FTP. On pourrait aussi raisonner en domaine fonctionnel.
  • Grâce à l’accès aux fonctions du package par la notation a point, cela nous évitez d’avoir des conflits de noms sur les fonctions. L’écriture sera claire, concise et précise.

Import

Définition

Cette déclaration d’importation permet l’utilisation de fonctions qui se trouvent dans des packages extérieures à notre application directement au sein de notre code source.

Mot clé

import

Syntaxe(s)

Il existe plusieurs syntaxes pour l’importation de packages. Voir ci-dessous pour les différentes écritures.

Remarque(s)

Ne pas utiliser d’espace dans les noms des packages et dans les noms d’alias de package.
GO n’autorise pas les références circulaires dans les packages.

Scope

La portée de l’import d’un package est au niveau du fichier et non sur la portée du package. Si celui-ci est utilisé sur plusieurs fichiers, on devra effectué son import dans chaque fichier GO.

Syntaxes

Présentation des différentes écritures pour importer des packages dans un programme. Les nom des de packages sont toujours entre guillemets. Pour plus de précision, je vous revois vers la documentation officielle sur les spécifications du langage ici

Simple

package main

import "fmt"

func main() {

	fmt.Println("Foobar")
}

Multiple

package main

import (
	"fmt"
	"math"
)

func main() {

	fmt.Println(math.Mod(7, 2))
}

Utilisation d’Alias

package main

import (
	"fmt"
	myMathPackage "math"
)

func main() {

	fmt.Println(myMathPackage.Mod(7, 2))
}

Sans nom du package

Cette notation n'est pas recommandé, voir même à bannir car elle va plutôt apporter de la confusion dans la lecture du code.
package main

import (
	. "fmt"
	. "math"
)

func main() {
	Println(Mod(7, 2))
}

Importer avec le “blank identifier”

Cela va permettre de pouvoir avoir les initialisations qui se trouvent, éventuellement, dans le package math. L'ensemble de ces initialisations doivent se trouver dans la fonction init du package. Tout le reste ne sera pas accessible.
package main

import (
	"fmt"
	_ "math"
)

func main() {
	fmt.Println("My name is John Doe")
}

Sous-répertoire

Dans certains cas, il se peut que des packages ou mêmes les vôtres se subdivisent en d'autres packages sous adjacents. Il faut donc pouvoir les importer aussi. Prenons le cas du package math, il se subdivise en 4 packages (donc 4 sous-répertoires) qui sont : rand, big, cmplx, bits et prenons pas exemple le cas où vous voulez travailler qu'avec les bits.
package main

import (
	"fmt"
	"math/bits"
)

func main() {
	fmt.Printf("LeadingZeros16(%016b) = %d\n", 1, bits.LeadingZeros16(1))
}

Frédéric Schmidt

Lead Technical Architect.

Ajouer un commentaire

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Recent Comments

    %d blogueurs aiment cette page :