Fácil Go
Inspecionando len e cap
Enunciado
Crie um slice com make([]string, 2, 5), atribua "a" e "b" nas posições 0 e 1 e imprima o len e o cap. Depois faça append de "c" e imprima novamente len e cap.
Requisitos
- Usar
make([]string, 2, 5)para criar o slice. - Imprimir
lenecapantes e depois doappend. - O
capdeve continuar 5 após o append (há espaço sobrando).
Código inicial
package main
import "fmt"
func main() {
// TODO: crie o slice com make, atribua valores e imprima len/cap
}
Saída esperada
antes: len=2 cap=5
depois: len=3 cap=5
Ver dica
make([]T, len, cap) cria um slice já com len elementos zero. Para atribuir, use índices s[0] = ....
Mostrar solução
package main
import "fmt"
func main() {
// make cria um slice com len=2 e cap=5 (3 posições livres no fim)
s := make([]string, 2, 5)
s[0] = "a"
s[1] = "b"
fmt.Printf("antes: len=%d cap=%d\n", len(s), cap(s))
// append usa a capacidade sobrando: não realoca
s = append(s, "c")
fmt.Printf("depois: len=%d cap=%d\n", len(s), cap(s))
}
Passo a passo
make([]string, 2, 5)cria um slice comlen=2ecap=5. Os dois primeiros elementos já existem (strings vazias).s[0]es[1]atribuem valores às posições válidas (índices vão de 0 alen-1).- O primeiro
Printfmostralen=2 cap=5. append(s, "c")adiciona na posição 2, que já está dentro da capacidade, então o backing array não é realocado.- O segundo
Printfmostralen=3, mascapcontinua 5.
Por que funciona
append só realoca quando len == cap. Como criamos com capacidade 5, ainda há espaço e o slice apenas aumenta seu len. O array subjacente é o mesmo.
Erros comuns
- Acessar
s[2]antes doappend: causa panicindex out of range, poislené 2. - Confundir
lencomcap:make([]string, 2, 5)não cria 5 strings vazias, apenas 2 visíveis. - Esquecer de reatribuir
s = append(s, ...): o compilador aceita, mas o slice antigo não vê o novo elemento.
Outra forma de resolver
Usar literal e depois append também funciona, mas o cap inicial seria igual a len, forçando realocação:
s := []string{"a", "b"} // cap = 2
s = append(s, "c") // realoca
Prefira make quando souber a capacidade necessária.
Saída esperada
antes: len=2 cap=5
depois: len=3 cap=5