Iteração

Você pode encontrar todo o código desse capítulo aqui

Para fazer coisas repetidamente em Go, você precisará do for. Go não possui nenhuma palavra chave do tipo while, do ou until. Você pode usar apenas for, o que é uma coisa boa!

Vamos escrever um teste para uma função que repete um caractere 5 vezes.

Não há nenhuma novidade até aqui, então tente escrever você mesmo para praticar.

Escreva o teste primeiro

package iteration
import "testing"
func TestRepeat(t *testing.T) {
repeated := Repeat("a")
expected := "aaaaa"
if repeated != expected {
t.Errorf("expected '%s' but got '%s'", expected, repeated)
}
}

Execute o teste

./repeat_test.go:6:14: undefined: Repeat

Escreva a quantidade mínima de código para o teste rodar e verifique o erro na saída

Mantenha a disciplina! Você não precisa saber nada de diferente agora para fazer o teste falhar apropriadamente.

Tudo o que foi feito até agora é o suficiente para compilar, para que você possa verificar se escreveu o teste corretamente.

package iteration
func Repeat(character string) string {
return ""
}

Não é legal saber que você já conhece o bastante em Go para escrever testes para problemas simples? Isso significa que agora você pode mexer no código de produção o quanto quiser sabendo que ele se comportará da maneira que você desejar.

repeat_test.go:10: expected 'aaaaa' but got ''

Escreva código o suficiente para fazer o teste passar

A sintaxe do for é muito fácil de lembrar e segue a maioria das linguagens baseadas em C:

func Repeat(character string) string {
var repeated string
for i := 0; i < 5; i++ {
repeated = repeated + character
}
return repeated
}

Ao contrário de outras linguagens como C, Java ou Javascript, não há parênteses ao redor dos três componentes do for. No entanto, as chaves { } são obrigatórias.

Execute o teste e ele deverá passar.

Variações adicionais do loop for podem ser vistas aqui.

Refatoração

Agora é hora de refatorarmos e apresentarmos outro operador de atribuição: o +=.

const repeatCount = 5
func Repeat(character string) string {
var repeated string
for i := 0; i < repeatCount; i++ {
repeated += character
}
return repeated
}

O operador adicionar & atribuir += adiciona o valor que está à direita no valor que esta à esquerda e atribui o resultado ao valor da esquerda. Também funciona com outros tipos, como por exemplo, inteiros (integer).

Benchmarking

Escrever benchmarks em Go é outro recurso disponível nativamente na linguagem e é tão facil quanto escrever testes.

func BenchmarkRepeat(b *testing.B) {
for i := 0; i < b.N; i++ {
Repeat("a")
}
}

Você notará que o código é muito parecido com um teste.

O testing.B dará a você acesso a b.N.

Quando o benchmark é rodado, ele executa b.N vezes e mede quanto tempo leva.

A quantidade de vezes que o código é executado não deve importar para você. O framework irá determinar qual valor é "bom" para que você consiga ter resultados decentes.

Para executar o benchmark, digite go test -bench=. no terminal (ou se estiver executando do PowerShell do Windows, go test-bench=".")

goos: darwin
goarch: amd64
pkg: github.com/quii/learn-go-with-tests/for/v4
10000000 136 ns/op
PASS

136 ns/op significa que nossa função demora cerca de 136 nanossegundos para ser executada (no meu computador). E isso é ótimo! Para chegar a esse resultado ela foi executada 10000000 (10 milhões de vezes) vezes.

NOTA por padrão, o benchmark é executado sequencialmente.

Exercícios para praticar

  • Altere o teste para que a função possa especificar quantas vezes o caractere deve ser repetido e então corrija o código para passar no teste.

  • Escreva ExampleRepeat para documentar sua função.

  • Veja também o pacote strings. Encontre funções que você considera serem úteis e experimente-as escrevendo testes como fizemos aqui. Investir tempo aprendendo a biblioteca padrão irá te recompensar com o tempo.

Resumindo

  • Mais praticás de TDD

  • Aprendemos o for

  • Aprendemos como escrever benchmarks