web-dev-qa-db-fra.com

casquette vs len de tranche en golang

Quelle est la difference entre cap et len ​​d'une tranche en golang?

Selon la définition:

Une tranche a à la fois une longueur et une capacité.

La longueur d'une tranche est le nombre d'éléments qu'elle contient.

La capacité d'une tranche est le nombre d'éléments dans le tableau sous-jacent, en comptant à partir du premier élément de la tranche.

x := make([]int, 0, 5) // len(b)=0, cap(b)=5

Est-ce que len signifie seulement des valeurs non nulles?

15
Ali Adravi

Une tranche est une abstraction qui utilise un tableau sous les couvertures.

cap vous indique la capacité du tableau sous-jacent. len vous indique le nombre d'éléments contenus dans le tableau.

L'abstraction de la tranche dans Go est très agréable, car elle redimensionnera le tableau sous-jacent. De plus, les tableaux dans Go ne peuvent pas être redimensionnés, les tranches sont donc presque toujours utilisées.

Exemple:

s := make([]int, 0, 3)
for i := 0; i < 5; i++ {
    s = append(s, i)
    fmt.Printf("cap %v, len %v, %p\n", cap(s), len(s), s)
}

Produira quelque chose comme ceci:

cap 3, len 1, 0x1040e130
cap 3, len 2, 0x1040e130
cap 3, len 3, 0x1040e130
cap 8, len 4, 0x10432220
cap 8, len 5, 0x10432220

Comme vous pouvez le constater une fois la capacité atteinte, append renverra une nouvelle tranche avec une plus grande capacité. À la 4ème itération, vous remarquerez une plus grande capacité et une nouvelle adresse de pointeur.

Exemple de lecture

Je me rends compte que vous n’avez pas posé de question sur les tableaux et les ajouts, mais ils sont assez fondamentaux pour comprendre la tranche et la raison des fonctions intégrées.

41
jmaloney

À partir du code source :

// The len built-in function returns the length of v, according to its type:
//  Array: the number of elements in v.
//  Pointer to array: the number of elements in *v (even if v is nil).
//  Slice, or map: the number of elements in v; if v is nil, len(v) is zero.
//  String: the number of bytes in v.
//  Channel: the number of elements queued (unread) in the channel buffer;
//  if v is nil, len(v) is zero.
func len(v Type) int

// The cap built-in function returns the capacity of v, according to its type:
//  Array: the number of elements in v (same as len(v)).
//  Pointer to array: the number of elements in *v (same as len(v)).
//  Slice: the maximum length the slice can reach when resliced;
//  if v is nil, cap(v) is zero.
//  Channel: the channel buffer capacity, in units of elements;
//  if v is nil, cap(v) is zero.
func cap(v Type) int
1
Tyler

Vous avez répondu à votre question. La longueur du tableau sous-jacent d’une tranche n’est pas nécessairement la même chose que le nombre d’éléments que ce tableau contient.

0
daplho