1 of 18

Go : Map, Structures et Références

Pierre-Etienne Moreau

2 of 18

Map

3 of 18

Map : déclaration et initialisation

  • Déclaration :�var m map[keyType]valueType�
  • Initialisation : �// Initialisation avec make

myMap := make(map[string]int)

// Initialisation littérale

myMap := map[string]int{}

// exemple avec des valeurs

myMap := map[string]int{"a": 1, "b": 2, "c": 3}

4 of 18

Map : ajout et accès

  • Ajouter des éléments à une Map
    • map[key] = value pour ajouter des éléments.
    • Exemple : m["clé1"] = 10
  • Accéder aux éléments d'une Map
    • valeur := map[key] pour accéder à une valeur.
    • Exemple : v := m["clé1"] (v vaudra 10)
  • Vérifier l'existence d'une clé
    • valeur, ok := map[key] pour vérifier si une clé existe.
    • v, ok := m["clé1"] (v vaudra 10 et ok sera true)
    • v, ok := m["clé2"] (v vaudra 0 et ok sera false).

5 of 18

Map : cardinalité et parcours

  • Parcours des éléments
    • for key, value := range m { … }�
  • len(m) : nombre d'entrées

6 of 18

Clé

  • une clé doit être de "type comparable"

map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are:

    • boolean, numeric, string, pointer, channel, and interface types, and structs or arrays that contain only those types.
    • Notably absent from the list are slices, maps, and functions; these types cannot be compared using ==, and may not be used as map keys.

7 of 18

Structures

8 of 18

Structures

type Vertex struct {

X, Y int

}

func main() {

v := Vertex{3, 4} // v est alloué dans la pile

fmt.Println(v)

}

9 of 18

En Go tout se fait par valeur

func main() {

v := Vertex{3, 4} // v est alloué dans la pile

c := v // c est alloué dans la pile, v est copié

c.X = 0

fmt.Println(v)

}

10 of 18

Mais il y a aussi des pointeurs

func main() {

v := Vertex{3, 4}

c := &v

c.X = 0 // meme chose que (*c).X = 0

fmt.Println(v)

}

https://go.dev/tour/moretypes/1

11 of 18

Points importants à comprendre

12 of 18

Les struct sont passés par valeur

13 of 18

Passage par valeur et copies

type Vertex struct {

X, Y float64

}

func (v Vertex) Move(dx,dy float64) Vertex {

v.X += dx

v.Y += dy

return v

}

func main() {

v := Vertex{3, 4}

w := v.Move(1,2)

fmt.Println(v,w)

}

14 of 18

Passage par référence

func (v *Vertex) Move2(dx,dy float64) Vertex {

v.X += dx

v.Y += dy

return *v

}

func main() {

v := Vertex{3, 4}

w := v.Move(1,2)

fmt.Println(v,w)

}

15 of 18

Inclusion de structures

16 of 18

Les reference types sont passés par référence

slice

map

channel

interface

function types

17 of 18

Retour sur la portée des variables

la portée d'une variable est le bloc dans lequel elle est définie

mais une variable peut être redéfinie (shadowing) :

func main() {

var x = 10

{

fmt.Println(x) // 10

var x = 5

fmt.Println(x) // 5

}

fmt.Println(x) // 10

}

18 of 18

Danger : multiple assignment

func main() {

x := 10

{

x, y := 5, 20 // /!\ x est redéfini

fmt.Println(x, y)

}

fmt.Println(x)

}