Sobes.tech
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)