Menu

Types de données en Golang : int, float64, string, bool, byte, rune

Les types intégrés de Go : tailles et plages des entiers, float32 et float64, bool, string, byte et rune, nombres complexes, valeurs zéro, et comment afficher le type d'une valeur avec %T.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Les types de base de Go sont les nombres, les booléens et les chaînes. Chaque variable a exactement un type, fixé à la compilation, et Go ne convertit jamais entre types à votre place. %T affiche le type de n'importe quelle valeur :

Remarquez que 'G' s'affiche 71 avec le type int32 : un caractère entre apostrophes est une rune, c'est-à-dire un nombre (le point de code Unicode). rune est un alias de int32 (le même type sous un second nom), donc %T indique int32. De même, byte indique uint8.

Entiers

TypeTaillePlage
int88 bits-128 à 127
int1616 bits-32 768 à 32 767
int3232 bitsenviron -2,1 milliards à 2,1 milliards
int6464 bitsenviron -9,2 × 10¹⁸ à 9,2 × 10¹⁸
uint8 (byte)8 bits0 à 255
uint1616 bits0 à 65 535
uint3232 bits0 à environ 4,3 milliards
uint6464 bits0 à environ 1,8 × 10¹⁹
int, uint32 ou 64 bitstaille du mot de la plateforme
uintptrtaille de la plateformecontient une valeur de pointeur, pour le code bas niveau

Utilisez int par défaut. len() renvoie un int, les indices de slice sont des int, et les compteurs de boucle sont des int. Sur toutes les plateformes 64 bits, int fait 64 bits. Tournez-vous vers les types à taille fixe quand la taille fait partie d'un contrat : int32 dans un format de fichier binaire, uint8 pour des octets bruts, int64 pour un timestamp Unix en nanosecondes.

Évitez les types non signés pour des quantités qui « ne peuvent pas être négatives », comme des comptes. Soustraire en dessous de zéro reboucle vers un nombre énorme au lieu de produire un négatif que vous pourriez détecter.

Limites et dépassement

Le package math a une constante pour chaque limite. À l'exécution, une opération entière qui dépasse reboucle silencieusement :

Pas de panic, pas d'erreur : 127 + 1 devient -128. Seules les expressions constantes sont vérifiées à la compilation (var b int8 = 128 ne compile pas). Si un dépassement est possible avec vos données, vérifiez avant l'opération ou utilisez math/big.

Littéraux entiers

million := 1_000_000   // underscores for readability (Go 1.13+)
mask := 0xFF           // hexadecimal
perm := 0o755          // octal (also the older form 0755)
flags := 0b1010        // binary

Nombres à virgule flottante

TypeTaillePrécision
float3232 bitsenviron 6 à 9 chiffres significatifs
float6464 bitsenviron 15 à 17 chiffres significatifs

Un littéral avec un point décimal ou un exposant (2.5, 1e6) est un float64 par défaut, et le package math prend et renvoie des float64. Utilisez-le sauf si la mémoire d'un gros tableau compte.

Les flottants sont binaires, donc la plupart des fractions décimales sont des approximations :

Deux règles en découlent. Ne comparez jamais des flottants avec == après un calcul. Et ne stockez jamais de l'argent dans un flottant : utilisez un nombre entier de centimes, ou une bibliothèque décimale.

Diviser un flottant par zéro donne +Inf, -Inf ou NaN au lieu de provoquer un panic. Diviser un entier par zéro provoque un panic à l'exécution (runtime error: integer divide by zero), et un diviseur constant nul est une erreur de compilation.

Booléens

bool contient true ou false, et sa valeur zéro est false. Go ne traite pas les nombres, les chaînes vides ou nil comme des booléens. if count {} est une erreur de compilation ; écrivez if count > 0 {}. Les opérateurs sont &&, || et !, et && et || s'évaluent en court-circuit.

Chaînes

Une string est une séquence immuable d'octets, généralement du texte UTF-8. len(s) compte les octets, pas les caractères :

é occupe deux octets en UTF-8, donc len indique 6 pour cinq caractères. Les chaînes entre guillemets doubles interprètent les échappements comme \n ; les chaînes brutes entre accents graves ne le font pas, et peuvent s'étendre sur plusieurs lignes. La page sur les chaînes couvre le package strings, et la page runes et octets traite UTF-8 en profondeur.

byte et rune

AliasÉquivaut àContient
byteuint8un octet de données brutes
runeint32un point de code Unicode

Ce sont des alias, pas de nouveaux types : un byte et un uint8 sont interchangeables sans conversion. Les noms disent ce que le nombre signifie.

Nombres complexes

Go a des types complexes intégrés, complex64 et complex128, avec real, imag et le package math/cmplx :

Peu de programmes en ont besoin, mais le traitement du signal et certains codes numériques oui.

Types composites et types référence

Les types de base se combinent en types composites. Chacun a sa propre page :

TypeExempleValeur zéro
tableau[3]inttrois zéros
slice[]intnil
mapmap[string]intnil
structstruct{ X, Y int }chaque champ à zéro
pointeur*intnil
fonctionfunc(int) intnil
channelchan intnil
interfaceerror, anynil

any est un alias de interface{} (depuis Go 1.18) et peut contenir une valeur de n'importe quel type.

Types nommés

Vous pouvez définir un nouveau type à partir d'un type existant. Il a la même représentation mais c'est un type distinct, et il peut avoir des méthodes :

type Celsius float64
type UserID int64

var t Celsius = 21.5
var f float64 = t // compile error: cannot use t (variable of float64 type Celsius) as float64 value in variable declaration

Cette rigueur est tout l'intérêt : un UserID ne peut pas être passé par erreur là où un OrderID est attendu. Convertissez explicitement quand c'est voulu : float64(t). Voir la conversion de types pour les règles et les fonctions strconv pour passer des nombres aux chaînes et inversement.

Valeurs zéro

Chaque type a une valeur zéro, que contient une variable avant toute affectation : 0 pour les nombres, false pour bool, "" pour les chaînes, et nil pour les pointeurs, slices, maps, channels, fonctions et interfaces. Il n'y a pas de variable non initialisée en Go.

Questions fréquentes

Quelle est la taille d'un int en Go ?

int et uint font 64 bits sur les plateformes 64 bits (amd64, arm64) et 32 bits sur les plateformes 32 bits. Si vous avez besoin d'une taille fixe, pour un format de fichier ou un protocole réseau, utilisez int32, int64, uint8 et ainsi de suite. Pour les compteurs, indices et longueurs ordinaires, utilisez int.

Comment afficher le type d'une variable en Go ?

Utilisez le verbe %T : fmt.Printf("%T\n", x) affiche int, float64, []string, main.User et ainsi de suite. Dans le code, reflect.TypeOf(x) renvoie la même information sous forme de valeur que vous pouvez inspecter.

Quelle est la différence entre byte et rune en Go ?

byte est un alias de uint8 et contient un octet de données brutes. rune est un alias de int32 et contient un point de code Unicode. Une chaîne est une séquence d'octets ; la parcourir avec for range la décode en runes.

Faut-il utiliser float32 ou float64 en Go ?

Utilisez float64 sauf si vous avez une raison contraire. C'est le type par défaut des littéraux à virgule flottante, le type avec lequel travaille le package math, et il offre environ 15 à 17 chiffres significatifs contre environ 6 à 9 pour float32. Choisissez float32 uniquement pour diviser par deux la mémoire de gros tableaux ou pour correspondre à un format externe.

Quelle est la valeur maximale d'un int en Go ?

Utilisez les constantes du package math : math.MaxInt (9223372036854775807 sur les plateformes 64 bits), math.MinInt, math.MaxInt64, math.MaxUint32 et ainsi de suite. Une opération arithmétique qui dépasse la limite reboucle silencieusement à l'exécution ; elle ne provoque pas de panic.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER