Marcio Trindade

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.

example.go
// nome do pacote o padrão é main
package main

// aqui você declara os pacotes que vai utilizar
import (
        "log"
        "os"
)

// função inicial que é executada quando você chama o programa
func main() {
        // Se a quantidade de argumentos for menor do que 2
        // loga uma mensagem de erro e para a execução do programa.
        if len(os.Args) < 2 {
                log.Fatal("You need to set the filename\nexample: ./example sample.csv")
        }

  // seta uma variável com o nome do arquivo
  // que foi passado como argumento.
        fileName := os.Args[1]

  // loga o nome do arquivo.
        log.Println(fileName)
}

Se executarmos o programa go run example.go veremos a saída desta maneira.

console
$go run example.go
2014/08/01 16:54:34 You need to set the filename
example: ./example sample.csv
exit status 1

Agora vamos abri este arquivo que recebemos como argumento e ler o conteúdo do mesmo, pra isso vamos adicionar o pacote encoding/csv. O arquivo está bem comentado pra entendermos o que está acontecendo em cada parte do nosso código.

example.go
// nome do pacote o padrão é o main
package main

// aqui você declara os pacotes que vai utilizar
import (
        "encoding/csv"
        "log"
        "os"
)

// função inicial que é executada quando você chama o programa
func main() {
        // Se a quantidade de argumentos for menor do que 2
        // loga uma mensagem de erro e para a execução do programa.
        if len(os.Args) < 2 {
                log.Fatal("You need to set the filename\nexample: ./example sample.csv")
        }

        // seta uma variável com o nome do arquivo
        // que foi passado como argumento
        fileName := os.Args[1]

        // aqui podemos ver uma atribuição dupla, muito comum em go
        // normalmente quando um erro ocorrer este é um dos retornos
        // da função. Aqui podemos ver que se um erro ocorrer
        // ao abrir o arquivo é atribuídoo o erro na variável err.
        file, err := os.Open(fileName)

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

        // força pra quando acabar a execução do programar
        // fechar o arquivo mesmo se um erro acorrer.
        defer file.Close()

        // criando um novo leitor do tipo csv para o nosso arquivo
        reader := csv.NewReader(file)
        // setando as configurações do nosso arquivo CSV
        reader.Comma = ','
        reader.TrimLeadingSpace = true

        // 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)
        }

        // escreve na saída o conteúdo do arquivo
        log.Println(lines)
}

Pra mostrar como ficou a saída do programa vou utilizar um arquivo csv simples com apenas uma coluna e 3 emails de teste.

console
$go run example.go sample.csv
2014/08/01 17:00:47 [[email] [email1@test.com] [email2@test.com] [email3@test.com]]

Até agora não fizemos muita coisa, mas já é possível perceber que escrever códigos em Go é simples e legal. Agora é a sua vez de praticar um pouco o que aprendemos até aqui e no próximo artigo continuaremos nosso programa pra fazer a separação dos emails.