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 len e cap antes e depois do append.
  • O cap deve 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

  1. make([]string, 2, 5) cria um slice com len=2 e cap=5. Os dois primeiros elementos já existem (strings vazias).
  2. s[0] e s[1] atribuem valores às posições válidas (índices vão de 0 a len-1).
  3. O primeiro Printf mostra len=2 cap=5.
  4. append(s, "c") adiciona na posição 2, que já está dentro da capacidade, então o backing array não é realocado.
  5. O segundo Printf mostra len=3, mas cap continua 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 do append: causa panic index out of range, pois len é 2.
  • Confundir len com cap: 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