Go channels

No post anterior, eu falei sobre go routines e criei um programa simples que envia um email de forma concorrente a execução do programa. No programa, nós chamavamos um método para enviar email de forma concorrente que apenas dava um println no final do envio para nos notificar que o email havia sido enviado com sucesso. Mas e se quisessemos que após o envio do email, fosse realizado algum tipo de operação, como efetuar um log, notificar alguém, etc. Poderíamos neste caso chamar uma func no final do envio do email. Mas podemos também utilizar channels, que é uma maneira de conversarmos entre go routines, sincronizando a sua execução. Para isso, basta criar um channel, passá-lo para a func de envio de email e, após o envio, enviar uma mensagem ao channel dizendo que está tudo ok! Agora podemos criar outra func que rode de forma concorrente e que receba esta mensagem do channel e faz o que for preciso.

package main

import (
    "fmt"
    "net/smtp"
)

func enviarEmail(m string, r chan string) {
    auth := smtp.PlainAuth("",
                           "user",
                           "pass",
                           "smtp.gmail.com",
    )

    smtp.SendMail("smtp.gmail.com:587",
                  auth,
                  "mail",
                  []string{"mail"},
                  []byte(m),
    )
    r <- "email enviado com sucesso"
}

func notificarEmail(r chan string) {
    fmt.Println(<-r)
}

func main() {
    fmt.Println("insira a mensagem do email")
    var m string
    fmt.Scanln(&m)
    
    c := make(chan string)

    go enviarEmail(m, c)
    go notificarEmail(c)
    fmt.Println("foi solicitado o envio do email, mas continuaremos com nosso programa ;)")

    fmt.Scanln(&m)
}

Eu criei um gist com esse código. Caso queira ver/comentar, etc, o link é este: https://gist.github.com/ceb10n/6b9fcf85f3ea63cfdafe

see yah 😉

Anúncios

Um comentário sobre “Go channels

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s