Go Longueur et capacité


Exemple

Les tranches ont à la fois la longueur et la capacité. La longueur d'une tranche correspond au nombre d'éléments présents dans la tranche, tandis que la capacité correspond au nombre d'éléments que la tranche peut contenir avant de devoir être réallouée.

Lors de la création d'une tranche à l'aide de la fonction make() intégrée, vous pouvez spécifier sa longueur et éventuellement sa capacité. Si la capacité n'est pas explicitement spécifiée, il s'agira de la longueur spécifiée.

var s = make([]int, 3, 5) // length 3, capacity 5

Vous pouvez vérifier la longueur d'une tranche avec la fonction len() intégrée:

var n = len(s) // n == 3

Vous pouvez vérifier la capacité avec la fonction cap() intégrée:

var c = cap(s) // c == 5

Les éléments créés par make() sont définis sur la valeur zéro pour le type d'élément de la tranche:

for idx, val := range s {
    fmt.Println(idx, val)
}
// output:
// 0 0
// 1 0
// 2 0

Exécutez-le sur play.golang.org

Vous ne pouvez pas accéder aux éléments au-delà de la longueur d'une tranche, même si l'index est dans la capacité:

var x = s[3] // panic: runtime error: index out of range

Cependant, tant que la capacité dépasse la longueur, vous pouvez ajouter de nouveaux éléments sans réallouer:

var t = []int{3, 4}
s = append(s, t) // s is now []int{0, 0, 0, 3, 4}
n = len(s) // n == 5
c = cap(s) // c == 5

Si vous ajoutez à une tranche qui n'a pas la capacité d'accepter les nouveaux éléments, la baie sous-jacente sera réallouée pour vous avec une capacité suffisante:

var u = []int{5, 6}
s = append(s, u) // s is now []int{0, 0, 0, 3, 4, 5, 6}
n = len(s) // n == 7
c = cap(s) // c > 5

Il est donc généralement recommandé d’allouer une capacité suffisante lors de la première création d’une tranche, si vous savez combien d’espace vous aurez besoin pour éviter des réaffectations inutiles.