Iteração
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

1
package iteracao
2
3
import "testing"
4
5
func TestRepetir(t *testing.T) {
6
repeticoes := Repetir("a")
7
esperado := "aaaaa"
8
9
if repeticoes != esperado {
10
t.Errorf("esperado '%s' mas obteve '%s'", esperado, repeticoes)
11
}
12
}
Copied!

Execute o teste

./repetir_test.go:6:14: undefined: Repetir

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.
1
package iteracao
2
3
func Repetir(caractere string) string {
4
return ""
5
}
Copied!
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.
repetir_test.go:10: esperado 'aaaaa' mas obteve ''

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:
1
func Repetir(caractere string) string {
2
var repeticoes string
3
for i := 0; i < 5; i++ {
4
repeticoes = repeticoes + caractere
5
}
6
return repeticoes
7
}
Copied!
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 +=.
1
const quantidadeRepeticoes = 5
2
3
func Repetir(caractere string) string {
4
var repeticoes string
5
for i := 0; i < quantidadeRepeticoes; i++ {
6
repeticoes += caractere
7
}
8
return repeticoes
9
}
Copied!
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.
1
func BenchmarkRepetir(b *testing.B) {
2
for i := 0; i < b.N; i++ {
3
Repetir("a")
4
}
5
}
Copied!
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=".")
1
goos: darwin
2
goarch: amd64
3
pkg: github.com/larien/aprenda-go-com-testes/primeiros-passos-com-go/iteracao/v4
4
10000000 136 ns/op
5
PASS
Copied!
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 ExampleRepetir 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
Last modified 10mo ago