A Go Slice contiene tres elementos: datos, la longitud, y la capacidad.
s := make([]int, 0, 10)
La variable s es una rebanada de enteros con una longitud de 0 y una capacidad de 10. El incorporada len() y la tapa() funciones le permiten obtener la longitud y la capacidad de una rebanada:
len(s) == 0
cap(s) == 10
para aumentar la longitud de un segmento, simplemente re-slice:
s = s[0:5]
// len(s) == 5
// cap(s) == 10
Para disminuir la longitud, se puede tomar una sub-división:
s = s[0:1]
// len(s) == 1
Hay algunas formas más cortas para invocar a make():
a := make([]int, 10)
// len(a) == cap(a) == 10
b := make([]int)
// len(b) == cap(b) == 0
Eso es todo muy bien, pero lo que si es necesario aumentar la longitud de un segmento más allá de su capacidad? Para hacer eso, necesita asignar un nuevo corte y copiar el contenido del antiguo corte al nuevo. (La función de "copia" es otra incorporado.)
t := make([]int, len(s), 20)
copy(t, s)
El Effective Go document toma este ejemplo un poco más lejos, la implementación de una función Anexar que anexa una rebanada a otra, cambiar su tamaño si es necesario.
Las divisiones están respaldadas por matrices; Cuando haces() un sector de una capacidad específica, se asigna una matriz de esa capacidad en el fondo. La porción se convierte efectivamente en un "puntero inteligente" para esa matriz. Si pasa esa porción (o una subslice de esa porción) a otra función, se pasa como un puntero a esa misma matriz. Esto hace que las subcategorías sean muy baratas de crear; la asignación de la matriz de respaldo es costosa.
La biblioteca estándar de Go incluye una serie de paquetes de contenedor (por ejemplo, vector) que eliminan la necesidad de administrar manualmente las divisiones. Usa rodajas para mayor velocidad y clases de contenedores más elaboradas para mayor comodidad. (Diciendo eso, todavía utilizo rebanadas para la mayoría de las cosas).
Quizás se esté preguntando por qué tiene que pasar por todos estos problemas. Después de todo, muchos lenguajes proporcionan matrices de tamaño dinámico como primitivas. La razón de esto está ligada a la filosofía de Go. Los diseñadores de idiomas no se atreven a saber cuál es la política de asignación adecuada para su programa; en cambio, te dan las herramientas que necesitas para construir tus propias estructuras de datos.
en profundidad de lectura: https://blog.golang.org/go-slices-usage-and-internals – user