Go : Map, Structures et Références
Pierre-Etienne Moreau
Map
Map : déclaration et initialisation
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}
Map : ajout et accès
Map : cardinalité et parcours
Clé
map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are:
Structures
Structures
type Vertex struct {
X, Y int
}
func main() {
v := Vertex{3, 4} // v est alloué dans la pile
fmt.Println(v)
}
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)
}
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)
}
Points importants à comprendre
Les struct sont passés par valeur
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)
}
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)
}
Inclusion de structures
https://go.dev/ref/spec (selectors)
Les reference types sont passés par référence
slice
map
channel
interface
function types
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
}
Danger : multiple assignment
func main() {
x := 10
{
x, y := 5, 20 // /!\ x est redéfini
fmt.Println(x, y)
}
fmt.Println(x)
}