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" acon longitud 10. Luego creamos el xsegmento de destino dividiendo esta amatriz, el ysegmento se crea utilizando el literal compuesto []int{3, 4}. Ahora, cuando añadimos ya x, el resultado es el esperado [1 2 3 4], pero lo que puede ser sorprendente es que el conjunto de respaldo atambién ha cambiado, ya que la capacidad de xdecir 10que es suficiente para anexar ya la misma, por lo que xse resliced que también utilizar el mismo aconjunto de respaldo, y append()copiará elementos de yallí.
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 xasí 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 xresultado, pero la matriz de respaldo ano cambió, porque la capacidad de xera "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 xy 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.