Sobes.tech
Junior — Middle

Ao passar dados para uma função: qual é mais eficiente em termos de uso de memória — um array ou um slice?

sobes.tech IA

Resposta da IA

Em Go, os arrays têm um tamanho fixo e são armazenados completamente na memória, enquanto os slices são uma estrutura que contém um ponteiro para um array, um comprimento e uma capacidade.

Do ponto de vista do uso de memória:

  • Array: ocupa exatamente a memória para todos os elementos, o tamanho é conhecido em tempo de compilação.
  • Slice: por si só, ocupa pouco memória (três palavras: ponteiro, comprimento, capacidade), mas aponta para um array que armazena os dados.

Ao passá-los para uma função:

  • Se passar um array, ele é copiado por completo, o que pode ser custoso em memória e tempo para tamanhos grandes.
  • Se passar um slice, apenas a estrutura do slice (ponteiro + comprimento + capacidade) é copiada, e os dados permanecem no array original, portanto, não há cópia de dados.

Portanto, passar um slice é mais eficiente em termos de uso de memória e desempenho, especialmente para conjuntos de dados grandes.

Exemplo:

func processArray(arr [1000]int) {
    // copia todo o array
}

func processSlice(s []int) {
    // apenas copia a estrutura do slice
}

func main() {
    var a [1000]int
    processArray(a)    // custoso
    processSlice(a[:]) // eficiente
}