Aller au contenu

Programmation en Go/Pointeurs et structures

Un livre de Wikilivres.

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 | modifier le wikicode]

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 | modifier le wikicode]

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