Creo que es importante señalar y saber que si la porción de destino (la porción a la que anexas) tiene capacidad suficiente, la adición se realizará "en el lugar", mediante la división del destino (la reducción para aumentar su longitud para ser capaz de acomodar los elementos anexables).
Esto significa que si el destino se creó cortando una matriz o segmento más grande que tiene elementos adicionales más allá de la longitud del segmento resultante, pueden sobrescribirse.
Para demostrarlo, vea este ejemplo:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Salida (pruébalo en Go Playground ):
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 10
x: [1 2 3 4]
a: [1 2 3 4 0 0 0 0 0 0]
Creamos una matriz de "respaldo" a
con longitud 10
. Luego creamos el x
segmento de destino dividiendo esta a
matriz, el y
segmento se crea utilizando el literal compuesto []int{3, 4}
. Ahora, cuando añadimos y
a x
, el resultado es el esperado [1 2 3 4]
, pero lo que puede ser sorprendente es que el conjunto de respaldo a
también ha cambiado, ya que la capacidad de x
decir 10
que es suficiente para anexar y
a la misma, por lo que x
se resliced que también utilizar el mismo a
conjunto de respaldo, y append()
copiará elementos de y
allí.
Si desea evitar esto, puede usar una expresión de corte completo que tenga la forma
a[low : high : max]
que construye un segmento y también controla la capacidad del segmento resultante configurándolo en max - low
.
Vea el ejemplo modificado (la única diferencia es que creamos x
así x = a[:2:2]
:
a := [10]int{1, 2}
fmt.Printf("a: %v\n", a)
x, y := a[:2:2], []int{3, 4}
fmt.Printf("x: %v, y: %v\n", x, y)
fmt.Printf("cap(x): %v\n", cap(x))
x = append(x, y...)
fmt.Printf("x: %v\n", x)
fmt.Printf("a: %v\n", a)
Salida (pruébalo en Go Playground )
a: [1 2 0 0 0 0 0 0 0 0]
x: [1 2], y: [3 4]
cap(x): 2
x: [1 2 3 4]
a: [1 2 0 0 0 0 0 0 0 0]
Como puede ver, obtenemos el mismo x
resultado, pero la matriz de respaldo a
no cambió, porque la capacidad de x
era "solo" 2
(gracias a la expresión de corte completo a[:2:2]
). Entonces, para hacer el apéndice, se asigna una nueva matriz de respaldo que puede almacenar los elementos de ambos x
y y
, que es diferente de a
.
append()
una función variable, y le...
permite pasar múltiples argumentos a una función variable desde un segmento.