Go Lunghezza e capacità


Esempio

Le fette hanno sia lunghezza che capacità. La lunghezza di una sezione è il numero di elementi attualmente nella sezione, mentre la capacità è il numero di elementi che la sezione può contenere prima di dover essere riallocata.

Quando si crea una sezione usando la funzione built-in make() , è possibile specificare la sua lunghezza e facoltativamente la sua capacità. Se la capacità non è specificata esplicitamente, sarà la lunghezza specificata.

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

Puoi controllare la lunghezza di una sezione con la funzione len() integrata:

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

Puoi verificare la capacità con la funzione cap() integrata:

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

Gli elementi creati da make() sono impostati sul valore zero per il tipo di elemento della slice:

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

Eseguilo su play.golang.org

Non è possibile accedere agli elementi oltre la lunghezza di una sezione, anche se l'indice è all'interno della capacità:

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

Tuttavia, finché la capacità supera la lunghezza, è possibile aggiungere nuovi elementi senza riallocare:

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

Se si aggiunge una porzione che non ha la capacità di accettare i nuovi elementi, l'array sottostante verrà riallocato per voi con una capacità sufficiente:

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

Pertanto, è generalmente buona norma allocare una capacità sufficiente quando si crea una sezione, se si conosce lo spazio necessario per evitare riallocazioni non necessarie.