Le Go par l'exemple: Pointeurs

Go supporte les pointeurs, ce qui permet de passer des références à des valeurs dans les programmes

package main
import "fmt"

Nous allons voir comment fonctionnent les pointeurs, par opposition aux valeurs, dans deux fonctions : zeroval et zeroptr. zeroval a un paramètre, donc les arguments lui sont passés par valeur. zeroval aura une copie de ival distincte de celle de la fonction appellante.

func zeroval(ival int) {
    ival = 0
}

zeroptr a cette fois-ci un paramètre *int, c’est-à-dire un pointeur sur un int. Le *iptr dans le corps de la fonction permet de deréférencer le pointeur de son adresse mémoire pour obtenir la valeur à cette adresse. Assigner une valeur à un pointeur déréférence change la valeur à l’adresse référencée.

func zeroptr(iptr *int) {
    *iptr = 0
}
func main() {
    i := 1
    fmt.Println("initial:", i)
    zeroval(i)
    fmt.Println("zeroval:", i)

La syntaxe &i donne l’adresse mémoire de i, c’est à dire un pointeur vers i.

    zeroptr(&i)
    fmt.Println("zeroptr:", i)

On peut afficher les pointeurs également. Pointers can be printed too.

    fmt.Println("pointer:", &i)
}

zeroval ne change pas le i dans main, mais zeroptr le fait car elle a une référence vers l’adresse mémoire de cette variable.

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

Exemple suivant: Structures.