Tableaux

Tableaux à taille fixe 
 Définition 
 Simplement Un tableau à taille fixe est une séquence d'éléments d'une taille définie 
 
 Tout est alloué d'un seul bloc ➡️ les cases sont contiguës en mémoire 
 Le premier index démarre à 0. 
 La taille est définitive, pour agrandir, il faut allouer un autre tableau ou utiliser une autre technique. 
 Le contenu sera toujours initialisé à 0, "", ... . 
 
 Syntaxe 
 var nom[taille]type 
 var tab[5]int
t[3] = 12 
 Déclaration rapide 
 odds := [4]int{1, 3, 5, 7}
pair := [4]int{2, 4} // [2, 4, 0, 0] 
 Affichage 
 var names [3]string
names[0] = "Bob"
names[2] = "Alice"

fmt.Printf("name[2]=%v\n", names[2])
fmt.Printf("names=%v (len=%d)\n", names, len(names)) 
 Tableaux dynamiques (Slice) 
 Définition 
 Tableau de taille dynamique 
 
 Slice ⇒ Tranche 🍰 
 Un Slice représente une tranche d'un tableau. 
 Un Slice est une "vue" sur le tableau sous-jacent 
 Modifier le slice ➡️ modifier le tableau 
 
 Syntaxe 
 s := make([]type, taille, capacité) 
 
 Taille : nombre d'éléments du slice 
 Capacité (facultatif) : nombre d'éléments du tableau 
 
 s := make([]int, 3) 
s[0] = -3
len(s) // 3 
cap(s) // 3 
 Réallocation 
 s := make([]int, 3) 
s = append(s, 12) 
len(s) // 4
cap(s) // 6 
 Explication : 
 
 Si on dépasse la taille du tableau 
 Un nouveau tableau est alloué, de capacité doublée 
 
 Sous-tableaux 
 letters := []string{"g", "o", "l", "a", "n", "g"}
fmt.Printf("%v \n", letters)

// subslicing
sub1 := letters[:2]
sub2 := letters[2:]
fmt.Printf("%v\n", sub1) // ?
fmt.Printf("%v\n", sub2) // ? 
 Référence des sous tableaux 
 Que se passe-t-il si on fait ça ? 
 letters := []string{"g", "o", "l", "a", "n", "g"}
sub1 := letters[:2]
sub2 := letters[2:]

sub2[0] = "UP"
fmt.Printf("%v\n", sub2) // ?
fmt.Printf("%v\n", letters) // ? 
 Et là ? 
 letters := []string{"g", "o", "l", "a", "n", "g"}
sub2 := letters[2:]

subCopy := make([]string, len(sub2))
copy(subCopy, sub1)
subCopy [0] = "UP"
fmt.Printf("%v\n", subCopy) // ?
fmt.Printf("%v\n", letters) // ?