Logo marque du langage Go

Série : Langage GO – Les conversions

Présentation des différentes conversions entre les types du le langage GO.

Introduction

Le Langage GO est un langage fortement typé cela signifie que dans la plupart des cas il est impossible qu’une variable de type entière devienne un type chaine de caractère, comme nous pouvons le voir dans d’autres langages. Mais, comme dans tout les langages fortement typés il existe certaines opérations qui permettent dans certaines conditions de convertir d’un type vers un autre. Attention on parle bien ici de conversion d’un type vers un autre et pas de changer le type de la variable.

On parle de conversion ou aussi de caster.

Ecritures impossible

Voici des exemples d’opérations qui vont générées des erreurs à la compilation dans le langage GO

Cette exemple va provoquer une erreur à la compilation, en plus, si vous travaillez par exemple sous Visual Code, il vous indiquera à l’aide d’un souligné rouge, avant même la compilation de cette erreur.

.\main.go:11:37: cannot use “Resultat: ” (type untyped string) as type int

Exemple 1

package main

import (
	"fmt"
)

func main() {

	var resultat int = 1

	var monTexte string = "Resultat: " + resultat

	fmt.Printf("%v\n", monTexte)

}

En Javascript aucun soucis, la résultante sera de type chaine de caractère.

var resultat = 9;
var monTexte = "Resultat: " + resultat;
document.write(monTexte);

Exemple 2

Cette exemple va provoquer une erreur à la compilation, en plus, si vous travaillez par exemple sous Visual Code, il vous indiquera à l’aide d’un souligné rouge, avant même la compilation de cette erreur. Par contre, le message d’erreur est différent :

.\main.go:11:29: constant 12.3 truncated to integer

package main

import (
	"fmt"
)

func main() {

	var resultat int = 1

	fmt.Printf("%v\n", resultat+12.3)

}

Conversion Explicite

On n’a, parfois, quand même le besoin d’effectuer des conversions. C’est pour cela que la Langage GO et d’autres aussi l’autorise.

Mais, dans en GO, il faut le faire explicitement. Un exemple sera plus parlant qu’un long discours.

package main

import (
	"fmt"
)

func main() {

	var resultat float32 = 1.9
	var resultatentier int = int(resultat)

	fmt.Printf("%v -> %v\n", resultat, resultatentier)
1.9 -> 1

Attention : ici on parle bien de conversion, d’un type vers un autre. Donc dans notre exemple aucun arrondi, ni action particulier n’est entrepris par GO. Il supprime purement la partie décimal. On aura donc une perte d’informations entre les deux.

Conversion Implicite

A noté toutefois que le langage GO accepte sans problème et sans précisions particulières certaines opérations entre différents types si et seulement si :

Aucunes pertes d’informations, de précisions n’est à déplorer.

ATTENTION : uniquement avec des valeurs et non pas des variables. Par exemple, le code suivant ne compilera pas car il faut faire une conversion explicite.

var resultat float32 = 1.9
var pv int = 100
s := resultat + pv <-- ERREUR A LA COMPILATION
var resultat float32 = 1.9

var pv int = 100
s := resultat + float32(pv) <-- CONVERSION EXPLICITE

Un exemple CORRECTE.

package main

import (
	"fmt"
)

func main() {

	var resultat float32 = 1.9

	s := resultat + 100 // <-- int
	fmt.Printf("Sans Conversion : %v,%T\n", s, s)

}
Sans Conversion : 101.9,float32

En résumé

Voilà maintenant vous savez :

  • Les règles pour effectuer correctement de bonnes conversion
  • Ce qui n’est pas possible de faire en conversion

A lire aussi …

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 :