Programmation en Go/Pointeurs et structures

Pointeurs

modifier

Les pointeurs sont un type important en Go. Nous les avons à peine évoqués dans un autre chapitre. Un pointeur est un peu comme l'adresse pointant sur une valeur, on peut retrouver cette valeur et la modifier à l'aide d'un pointeur.

Un pointeur est déclaré en faisant précéder le type de donnée pointée par une étoile (*int est un pointeur sur un entier). On prend l'adresse pointant sur une donnée en la faisant précéder de &:

var i = 5
var j *int = &i // pointeur sur i

Ensuite on peut récupérer la valeur sur laquelle on pointe en précédant le pointeur par une étoile:

var k = *j // k vaut 5

On peut modifier la valeur pointée avec *p=v:

*j = 6

Mais, maintenant, i vaut également 6, car j correspond à l'adresse de i! On peut également utiliser += pour ajouter une valeur:

*j+=10
k=*j // k vaut également 16 maintenant

Le pointeur 'nil'

modifier

Le mot-clé nil représente un pointeur qui ne pointe sur aucune valeur licite. Cela peut représenter la valeur initiale d'un pointeur qui ne pointe vers 'rien'.

Les types structurés

modifier

On peut déclarer un alias vers un type en Go en utilisant le mot-clé type suivi du type défini, par exemple:

type Vecteur3D [3]float32
var vec Vecteur3D

On peut déclarer un type structuré ou structure, en utilisant le mot-clé struct:

type Intervalle struct {
    debut int
    fin   int
}

On peut déclarer une valeur littérale de structure comme ceci:

intervalle := Intervalle{0,3}
inter2 := Intervalle{fin:5}

Mais en général on utilise un pointeur sur une structure, pour ne pas la passer par valeur mais par référence:

inter  := new(Intervalle)
inter2 := &Intervalle{0,5}

On accède ensuite à chaque champ d'une structure ou de son pointeur en faisant suivre la valeur d'un point suivi du nom du champ:

inter.fin += inter.debut