Junior
Qual é a principal diferença entre slices e arrays em Go?
sobes.tech IA
Resposta da IA
Os slices são vistas de arrays que podem ser alteradas dinamicamente.
| Característica | Array | Slice |
|---|---|---|
| Tamanho | Fixo, determinado na criação | Dinâmico, pode mudar |
| Tipo | [n]T (onde n é o tamanho, T é o tipo) |
[]T (onde T é o tipo) |
| Passagem em funções | Por valor (cópia) | Por referência ao array subjacente, passam head, len e cap (na prática, uma nova estrutura SliceHeader com cópias desses campos) |
| Criação | var a [5]int ou b := [3]string{"a", "b", "c"} |
var s []int ou t := []int{1, 2, 3} ou u := make([]int, 5) |
| Desempenho | Mais previsível devido ao tamanho fixo, pode ser melhor em tamanhos pequenos | Pode ter custos adicionais ao alterar o tamanho (realocação do array subjacente) |
// Exemplo de array
var arr [3]int = [3]int{1, 2, 3}
// Exemplo com slice criado a partir do array
slice := arr[1:] // slice {2, 3}
// Exemplo de criação de slice
s := []int{10, 20, 30} // array subjacente {10, 20, 30}, len = 3, cap = 3
// Alterando o slice
s = append(s, 40) // agora s {10, 20, 30, 40}. Se não houver capacidade suficiente, um novo array subjacente será criado, len = 4, cap = 6 (normalmente dobrando a capacidade).
// Alterar um elemento do slice altera o array subjacente
slice[0] = 99 // arr agora {1, 99, 3}
fmt.Println(arr)