Marcio Trindade

Agosto de 2014

Brincando com Go parte 2

Este artigo é uma continuação do artigo anterior Brincando com Go parte 1 que se você ainda não viu recomendo que comece por ele. Nesta etapa vamos separar a nossa lista de emails em 3 slices e escrever estes em arquivos distintos.

Primeiro vamos adicionar a lógica pra separar os emails em 3 slices.

example.go
...
// lendo o arquivo inteiro e atribuindo o valor na variável lines,
// se um erro ocorrer ficará na variável err.
lines, err := reader.ReadAll()

// Loga o erro se o mesmo ocorrer
// e para a execução do programa.
if err != nil {
        log.Fatal("Error reading all lines: ", err)
}

// declarando as variaveis que serão utilizadas
// para fazer as separações dos emails
var headers []string
var validEmails [][]string
var invalidEmails [][]string
var duplicatedEmails [][]string

// vamos criar agora uma variável do tipo map, que
// é bem parecido com o hash do Ruby,para
// identificarmos os emails duplicados.
existEmails := make(map[string]bool)

// loop for pra interar em todos os emails
for i, line := range lines {
        // separando a primeira linha que é o
        // cabeçalho do CSV.
        if i == 0 {
                headers = line
                continue
        }

        // tratando o email, que deve ser sempre
        // a primeira coluna do arquivo.
        email := line[0]
        // remove os espaços em branco.
        email = strings.TrimSpace(email)
        // transforma em caixa baixa.
        email = strings.ToLower(email)
        // retorna o email tratado para o csv.
        line[0] = email

        // verifica se já existe a chave email no map.
        if existEmails[email] {
                // se tiver adicionamos a linha no slice de emails duplicados.
                duplicatedEmails = append(duplicatedEmails, line)
        } else {
                // verifica se o email é válido atraves de expressão regular.
                valid, _ := regexp.MatchString(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`, email)
                if valid {
                        // emails válidos são adicionados no slice de emails válidos.
                        validEmails = append(validEmails, line)
                } else {
                        // emails inválidos são adicionados no slice de emails inválidos.
                        invalidEmails = append(invalidEmails, line)
                }
                // adiciona o email no map de emails duplicados sendo
                // a chave o email e o valor um boleano true
                existEmails[email] = true
        }
}

// logando os emails já separados
log.Println("headers", headers)
log.Println("validEmails", validEmails)
log.Println("invalidEmails", invalidEmails)
log.Println("duplicatedEmails", duplicatedEmails)
...

Brincando com Go parte 1

Comecei a estudar Go a pouco tempo e estou gostando do que estou aprendendo, é incrível como escrever é simples e a performance é realmente boa. Mesmo a linguagem sendo tipada e compilada isso não deixa as coisas chatas.

Depois de fazer o tour comecei a escrever um programa simples que lê um arquivo csv com uma lista de emails e a separa em emails válidos, inválidos e duplicados. O código do mesmo está disponível no github.

Pretendo fazer aqui um pequeno passo a passo de como escrevi este programa. Neste primeiro momento vamos ver como receber o nome do arquivo como argumento e ler o mesmo.

Pra tratar os argumentos é bem simples, você só precisa importar o pacote "os" e este tem uma variável chamada Args que é um slice de strings com os argumentos sendo o primeiro deles o nome do programa.