Eu acho importante salientar e saber que, se a fatia de destino (a que você anexa) tiver capacidade suficiente, o anexo ocorrerá "no local", realocando novamente o destino (realocando novamente para aumentar seu comprimento para ser capaz de acomodar os elementos anexáveis).
Isso significa que, se o destino tiver sido criado dividindo uma matriz ou fatia maior que possua elementos adicionais além do comprimento da fatia resultante, eles poderão ser substituídos.
Para demonstrar, veja este exemplo:
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)
Saída (experimente no 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]
Criamos uma matriz "de apoio" acom comprimento 10. Em seguida, criamos a xfatia de destino cortando essa amatriz, a yfatia é criada usando o literal composto []int{3, 4}. Agora, quando anexar ya x, o resultado é o esperado [1 2 3 4], mas o que pode ser surpreendente é que a matriz de suporte atambém mudou, porque a capacidade de xseja 10o que é suficiente para anexar ya ele, assim xé resliced que também usará o mesmo aleque de apoio, e append()irá copiar elementos de ypara lá.
Se você quiser evitar isso, use uma expressão de fatia completa que tenha o formato
a[low : high : max]
que constrói uma fatia e também controla a capacidade da fatia resultante, configurando-a para max - low.
Veja o exemplo modificado (a única diferença é que criamos xassim 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)
Saída (experimente no 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 você pode ver, obtemos o mesmo xresultado, mas a matriz de backup anão mudou, porque a capacidade de xera "apenas" 2(graças à expressão de fatia completa a[:2:2]). Para fazer o acréscimo, é alocada uma nova matriz de apoio que pode armazenar os elementos de ambos xe y, o qual é distinto a.
append()uma função variadica e...permite passar vários argumentos para uma função variadic a partir de uma fatia.