Arrays, Slices & Maps at a Glance
Arrays são valores de tamanho fixo; slices e maps são coleções semelhantes a referências embutidas na linguagem.
Busque em todas as páginas da documentação
Arrays são valores de tamanho fixo; slices e maps são coleções semelhantes a referências embutidas na linguagem.
A maioria do código Go usa slices e maps diariamente, então len, cap e as regras de compartilhamento são importantes.
Um array [N]T tem o tamanho como parte do tipo.
Um slice []T é um cabeçalho (ponteiro, len, cap) sobre um array subjacente.
Um map map[K]V é uma tabela hash com ordem de iteração indefinida.
Slices e maps são passados copiando o cabeçalho, então as mutações são visíveis para os chamadores.
Cartão de referência rápida - pronto para copiar e colar.
package main
import "fmt"
func main() {
nums := make([]int, 0, 4)
nums = append(nums, 1, 2, 3)
ages := map[string]int{"ada": 36}
ages["grace"] = 34
fmt.Println(nums, len(nums), cap(nums), ages)
}Quando usar isso:
make([]T, 0, n) quando souber o tamanho aproximado.package main
import "fmt"
func addSuffix(names []string, suffix string) {
for i := range names {
names[i] += suffix
}
}
func main() {
original := []string{"go", "rust"}
view := original[0:2:2] // expressão de slice completa limita a capacidade de append
addSuffix(view, "!")
counts := map[string]int{}
for _, name := range original {
counts[name]++
}
fmt.Println(original, counts)
keys := make([]string, 0, len(counts))
for k := range counts {
keys = append(keys, k)
}
fmt.Println("keys (unordered):", keys)
}O que isso demonstra:
addSuffix muta original.s[low:high:max] limita a capacidade de crescimento do append.make ou literais antes de escrever.append de Slice aumenta a capacidade alocando um novo array quando len == cap (tipicamente dobrando).s[low:high] define len como high-low e cap como cap(s)-low.Array [n]T | Slice []T | Map map[K]V | |
|---|---|---|---|
| Tamanho | Fixo no tipo | Dinâmico | Dinâmico |
| Passar para func | Copia o array inteiro | Copia o cabeçalho | Copia o cabeçalho |
| Valor zero | Todos os elementos zero | nil | nil |
| Comparável | Sim (se T for comparável) | Não | Não |
| Acesso por índice | a[i] | s[i] | m[k] com forma ok |
| Expressão | Significado |
|---|---|
len(s) | Número de elementos visíveis no slice |
cap(s) | Elementos do primeiro índice até o final do array de suporte |
make([]T, len, cap) | Aloca array, define len e cap |
append(s, x) | Aumenta len, pode realocar se len == cap |
// Deletar entrada de map
delete(m, key)
// Limpar map em Go 1.21+
clear(m)
// Copiar slices
dst := make([]int, len(src))
copy(dst, src)a := []int{1,2,3}; b := a[:2]; append(b, 99) pode sobrescrever a[2] se a capacidade permitir. Correção: use slice completo a[:2:2] ou append a uma cópia.make primeiro.[5]int não é []int sem fatiar arr[:]. Correção: fatie com [:].*[N]T ou use um slice.sync.Map ou um mutex.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Slice | Coleção ordenada padrão | Precisa de busca O(1) por chave |
| Map | Busca por chave | Precisa de ordem estável sem ordenação extra |
| Array | Tamanho fixo de formato de rede | Listas de propósito geral |
container/list | Inserções frequentes no meio (raro) | Na maioria dos casos - slices são melhores |
len é quantos elementos você pode ler/escrever a partir do índice 0.
cap é quantos elementos existem no array de suporte começando no primeiro elemento do slice.
Sim - len e cap são 0, range funciona, e append aloca armazenamento de suporte.
v, ok := m[key]
if !ok { /* ausente */ }Não - chaves devem ser comparáveis; slices, maps e funções não são comparáveis.
make([]T, 0, expected) e depois append, ou make([]T, expected) se você for indexar diretamente.
Define len como high-low e cap como max-low, impedindo que o append leia além de max.
O array inteiro é copiado.
Para buffers [1024]byte, passe um slice buf[:] ou um ponteiro em vez disso.
Não - &m[key] é ilegal porque o armazenamento do map pode se mover durante o crescimento.
Armazene o valor em uma variável primeiro se precisar de um ponteiro.
Itere e atribua: for k, v := range other { m[k] = v }.
Cuidado com a sobrescrita de chaves existentes.
Ele pode retornar um novo cabeçalho se ocorrer realocação.
Sempre atribua: s = append(s, x).
Array é um tipo de valor [0 0 0].
Slice é um cabeçalho nil sem array de suporte.
append([]T(nil), s...) ou s2 := make([]T, len(s)); copy(s2, s).
[]byte como slices de bytesVersões da Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, modernizadores go fix - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação), e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026