# Tableaux

## Tableaux à taille fixe

### Définition

<p class="callout info">Simplement Un tableau à taille fixe est une séquence d'éléments d'une taille définie</p>

- 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

```go
var nom[taille]type
```

```go
var tab[5]int
t[3] = 12
```

#### Déclaration rapide

```go
odds := [4]int{1, 3, 5, 7}
pair := [4]int{2, 4} // [2, 4, 0, 0]
```

### Affichage

```go
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

```go
s := make([]type, taille, capacité)
```

- **Taille** : nombre d'éléments du slice
- **Capacité** (facultatif) : nombre d'éléments du tableau

```go
s := make([]int, 3) 
s[0] = -3
len(s) // 3 
cap(s) // 3
```

### Réallocation

```go
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

```go
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 ?

```go
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à ?

```go
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) // ?
```