Pular para o conteúdo principal

victorstein.dev

Tag: Golang

37/100 Dias de Golang - Strings

# Strings

Vamos ver como funciona a biblioteca padrão do golang para manipulação de strings. Esse pacote oferece funções para busca, substituição, divisão, transformação e muito mais. Obviamente que o nome do pacote é strings.

Para saber se uma string contém outra, use strings.Contains:

s := "victorstein.dev"
if strings.Contains(s, "victor") {
    fmt.Println("Achou!")
}

Fazer o replace de um substring

s := "victorstein.dev"

nova := strings.ReplaceAll(s, ".dev", ".com")
fmt.Println(nova) // victorstein.com

Dividir strings

partes := strings.Split("a,b,c", ",")
fmt.Println(partes) // [a b c]

Juntar

Ler Mais

36/100 Dias de Golang - Select Goroutines

# Select Goroutines

Fiz vários posts falando sobre goroutines:

  1. 17/100 Dias de Golang - Concorrência e Goroutines
  2. 18/100 Dias de Golang - Goroutines, WaitGroup, Race condition e Mutex
  3. 19/100 Dias de Golang - Channels
  4. 20/100 Dias de Golang - Exemplo de goroutines, mutex e channels

Segundo o roadmap.sh do Golang, não fiz um post falando sobre Select, vamos corrigir isso então.

Se você já usou uma linguagem que possui switch, vai notar que select funciona de maneira semelhante, mas é voltado para a comunicação entre canais. O select permite que uma goroutine espere em múltiplos canais ao mesmo tempo. Ele escolhe um dos casos cujo canal está pronto para receber ou enviar e executa o bloco correspondente. Veja a sintaxe básica:

Ler Mais

35/100 Dias de Golang - Error Handling

# Error Handling

O tratamento de erros em Go é bem diferente do que em outras linguagem, não temos o tradicional try/except. Os erros em Go são simplesmente retornados como uma variável normal, daí que surge o famoso if err != nil {} do Golang. Nas primeiras vezes que vi essa estrutura foi meio estranho, mas depois fez bastante sentido. Essa estrutura vai completamente de encontro ao design da linguagem do Golang, manter a simplicidade e eficiencia da linguagem. Vamos criar uma função de divisão e retornar um erro quando o divisor é 0.

Ler Mais

34/100 Dias de Golang - Como o Runtime do Golang Gerencia Goroutines

# Como o Runtime do Golang Gerencia Goroutines

O scheduler do Go é responsável por organizar e distribuir a execução das goroutines nas threads do sistema operacional. Como já falamos em outro post sobre as goroutines são muito mais leves que threads, então você pode ter milhares rodando ao mesmo tempo. Mas como o sistema operacional tem um número limitado de threads, o scheduler cuida de organizar quais goroutines rodam em quais threads e quando.

Ler Mais

33/100 Dias de Golang - make()

# make()

Aproveitando o Dia 32/100 busquei no roadmap.sh sobre os tópicos que já tinha estudado e verifiquei quais pontos ainda não tinha visto ou não sabia do que se tratava. A função make() entra nos assuntos que já vi nos materias que estou usando para estudar, mas pensando com mais profundidade não sei qual a utilidade dela nem quando fazer uso da mesma. Nesse posto pretendo sanar essas dúvidas.

Ler Mais

32/100 Dias de Golang - Caminhos para estudar Golang

# Caminhos para estudar Golang

Não cheguei nem em metade dos 100 dias e estou meio perdido em quais caminhos seguir para estudar. Procurei alguns materiais e encontrei vários caminhos bem interessantes.

# Go | Tech Guide - Alura

Go | Tech Guide - Alura Material muito legal desenvolvido pelo pessoal da Alura. Está dividido em 3 níveis de profundidade.

# Roadmap.sh

Roadmap.sh Caminho bem legal para seguir, passa por todo o básico da linguagem para depois ir para CLI, ORM, Frameworks Web, Logging, WebSockets, API, Testes e Ferramentas para microserviços.

Ler Mais

31/100 Dias de Golang - GORM

# GORM

GORM é um ORM para Golang, segundo a documentação “The fantastic ORM library for Golang aims to be developer friendly.” Vamos seguir o quickstart da documentação e criar um exemplo mais nosso.

Instalação do gorm e sqlite

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

Vamos definir uma struct Livros que no futuro se transformará na nossa tabela do banco de dados.

type Livros struct {
  Autor  string
  Nome string
  NumeroDePaginas uint
}

Fazer a conexão com o banco de dados, veja que estamos utilizando o sqlite como banco. Caso seja utilizado outro banco, o import do driver deve ser diferente.

Ler Mais

30/100 Dias de Golang - Testes - Exemplo Prático

# Testes - Exemplo Prático

Vamos fazer um exemplo completo com o conhecimento que adquirimos até agora sobre testes na linguagem Go. Para esse exemplo vou criar um pacote chamado “stats” com algumas funções estatísticas simples. Usarei também testify que vimos no 29/100 Dias de Golang - Testes com Testify.

Vamos iniciar o projeto:

go mod init stats

E já adicionar as libs necessárias:

go get github.com/stretchr/testify/assert
go get github.com/stretchr/testify/require

Vamos criar um arquivo e adicionar duas funções, média e mediana. Veja que fiz algumas validações se o slice é vazio e criei um erro específico para isso.

Ler Mais

29/100 Dias de Golang - Testes com Testify

# Testes com Testify

Toda a concepção do Go e as escolhas arquiteturais da linguagem são direcionadas para tornar a linguagem simples. Podemos ver isso claramente nos testes:

if total != expected {
	t.Errorf("Esperava %d recebi %d", expected, total)
}

Não temos um assert como em outras linguagens para verificar os valores. Para preencher esse “gap” no coração dos programadores temos a lib Testify. Vamos criar alguns testes com ela, mas antes vamos instalar a lib no nosso projeto:

Ler Mais

28/100 Dias de Golang - Testes em Go com Fuzzing

# Testes em Go com Fuzzing

Já vimos que é muito importante termos testes de integração nos nossos códigos, vimos também sobre cobertura de código e comentamos que mesmo que um código esteja com 100% de cobertura não é garantia que ele esteja correto, lembre da frase do Dijkstra “Os testes mostram a presença, não a ausência de bugs”. É aqui que entra o fuzzing, uma técnica poderosa para encontrar falhas inesperadas no código. Desde a versão 1.18, o Go oferece suporte nativo ao fuzzing, tornando essa abordagem mais acessível para desenvolvedores.

Ler Mais