Postagem em destaque

Código Limpo: Nomes Significativos

Imagem
Às vezes fico com um assunto na cabeça por semanas, até achar uma situação ou um exemplo que esclareça a situação. Explico: estava querendo já a algum tempo escrever sobre boas práticas de programação, e pensei em iniciar por "Nomes Significativos", para seguir a nomenclatura utilizada pelo ótimo livro Código Limpo , de Robert C. Martin.  Entretanto, ficava sempre amarrado em exemplos que pareciam ser bons, mas que ainda eu não tinha visto a utilidade prática.  Antes de continuar preciso explicar que tenho um hábito de anotar num bloco de papel todas as ideias que surgem, pois elas desaparecem com a mesma velocidade que aparecem. Para isso tenho um bloco e caneta na mesa de cabeceira (além de um no banheiro), pois esses são os lugares onde tenho mais ideias... Vai entender... Semana passada, estava com um problema bem complicado e tive uma ideia: "vou criar uma variável para indicar que quando um arquivo tiver um certo tamanho deve gravar algumas informações no log. Pois

Dicas Go - #1 - Goroutines

Já falei um pouco sobre concorrência em Go, mas percebi que não fui muito esclarecedor, por isso vou fazer uma outra abordagem, mais detalhada, sobre esse assunto. O código completo dos programas está no final do texto.

Vamos imaginar que você queira fazer um programa que faça acesso à uma API algumas vezes e retorne o resultado como string. Para não tornar o programa muito complexo, utilizei uma pesquisa fake, que simula um retorno e gasta  100 milissegundos. Ao rodar o programa sequencial.go, vemos na tela uma saída como a abaixo:


Como esperado, os resultados são listados em ordem, de "golang 0" à "golang 19". E o tempo gasto, pouco mais de 2s, também não é nenhuma surpresa (20 vezes 100 milissegundos mais algum tempo do resto do código).

A coisa começa a melhorar quando rodamos o programa concorrente.go.


O tempo gasto reduziu de 2s para 100ms. Qual é a mágica? São as goroutines! Se reparar bem, são poucas mudanças em relação ao código original (na verdade, essa é uma das formas que podemos usar as goroutines, mas é a que acho mais simples).

A primeira mudança é a criação de um canal com buffer de capacidade 4. Na prática, podemos enviar até 4 valores neste canal sem bloquear a goroutine. 

c := make(chan string, 4)

A segunda mudança é a chamada da função fakeSearch:

go func(j int) {
c <- fakeSearch("golang " + fmt.Sprintf("%d", j))
}(i)

Usamos uma função anônima para englobar a chamada em si, pois esta retorna um canal de string e não temos como chamar a função da forma abaixo:

go c <- fakeSearch("golang " + fmt.Sprintf("%d", j))

Por fim, temos que ler as respostas do canal, e para isso usamos um for para ler cada uma das respostas:

for i := 0; i < 20; i++ {
fmt.Printf("#%d - %s", i, <-c)
}

Aqui, o programa simplesmente joga o resultado que está no canal (<-c) para a tela, mas ele poderia ser armazenado num slice de strings por exemplo.

Código dos programas

Comentários

Postagens mais visitadas deste blog

Netflix não mostra ícone de streaming

Google Hacking

FTP não funciona no PHP