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" a
com comprimento 10
. Em seguida, criamos a x
fatia de destino cortando essa a
matriz, a y
fatia é criada usando o literal composto []int{3, 4}
. Agora, quando anexar y
a x
, o resultado é o esperado [1 2 3 4]
, mas o que pode ser surpreendente é que a matriz de suporte a
também mudou, porque a capacidade de x
seja 10
o que é suficiente para anexar y
a ele, assim x
é resliced que também usará o mesmo a
leque de apoio, e append()
irá copiar elementos de y
para 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 x
assim 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 x
resultado, mas a matriz de backup a
não mudou, porque a capacidade de x
era "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 x
e 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.