Guia da linguagem Go
Guia da linguagem Go – Go ou Golang como é comumente conhecida pela comunidade, é uma linguagem de programação desenvolvida pela Google em setembro de 2007, mas que só veio a público em novembro de 2009.
Sobretudo grandes nomes da área da computação fizeram parte do desenvolvimento dessa linguagem, sendo eles, Robert Griesemer, Ken Thompson e Rob Pike. A linguagem Go se desenvolveu visando solucionar os desafios de engenharia enfrentados pelos desenvolvedores e desenvolvedoras do Google ao utilizar a linguagem C.
Go tem como suas principais características:
- É uma linguagem compilada;
- Estaticamente e fortemente tipada, além de possuir o recurso de inferência de tipos ou duck typing;
- Possui um garbage collector integrado, prevenindo problemas de vazamento de memória e um gerenciamento de memória apropriado;
- É uma linguagem opinativa, ela segue um sistema de tipos e lança erros variáveis ou bibliotecas não usuais se declaram no programa;
- É simples de compilar e empacotar, gerando binários que podem ser executados diretamente pelo sistema operacional sem a necessidade de instalar nenhum interpretador previamente;
- Extensa biblioteca padrão com ferramentas para comunicação HTTP, serialização e desserialização de dados, expressões regulares e muito mais.
Como instalar a linguagem e nosso primeiro exemplo
Como qualquer outra linguagem, a Golang tem primeiramente as suas próprias regras de sintaxe e estrutura. Vamos imprimir o tradicional “Hello World” e você verá como é fácil!
package main
import "fmt"
func main() {
fmt.Println("Olá Mundo")
}
Conhecendo variáveis e constantes
O Go é uma linguagem de tipagem estática, ou seja, existe um sistema de tipos bem definido validado durante o tempo de compilação do código. Além disso, o Go também é uma linguagem fortemente tipada, isso significa que o Go não irá realizar conversão automática de tipos, caso alguma conversão seja necessária ela deve ser feita de forma explícita pela pessoa que está desenvolvendo o software.
Por padrão, o Go possui em sua biblioteca padrão diversos tipos de dados, abaixo estão listados os mais comuns de serem utilizados:
int: é um tipo inteiro que pode conter 32 ou 64 bits, a definição de qual o tamanho em memória será utilizado vai depender da arquitetura da máquina em que o código está sendo executado;
uint: tem o mesmo comportamento do tipo int, mas só recebe valores sem sinal;
float32: trata-se de um tipo de dado de ponto flutuante de 32 bits. Isso quer dizer que ele permite armazenar valores decimais entre 6 e 7 casas. Porém, o armazenamento em memória pode não representar necessariamente o valor repassado. Por exemplo, um float32 definido com “0,001” pode acabar sendo armazenado como “0,00100001”, e isso não somente no Go, já que isso é decorrência dos pontos flutuantes, em geral. Por isso, o tipo float32 não deve ser usado para operações que precisam passar por várias operações aritméticas, como sistemas financeiros. Isso porque, a primeira vista, essa imprecisão pode não impactar, mas na sequência de operações realizadas, estas imprecisões podem começar a aparecer nos resultados;
float64: representa um ponto flutuante de 64 bits. Por isso, ele permite armazenar números de até cerca de 15 casas decimais. A observação para o tipo float32 também é válida para o tipo float64, por ser um tipo de dado que é armazenado por aproximação de valores, ele não deve ser utilizado em operações que demandam precisão absoluta;
bool: é um dos tipos de dados mais simples, pois ele pode armazenar apenas dois valores: true (verdadeiro) ou false (falso). É empregado para realizar testes lógicos, dentro de estruturas de decisão e repetição, por exemplo;
string: trata-se de um conjunto de caracteres de tamanho indefinido.
Após vermos os tipos de dados, podemos criar nossas variáveis. Elas têm algumas regras, como, por exemplo, devem ser claras e autoexplicativas.
package main
func main() {
var idade int = 18
var nome string = "Cleyson"
}
Também é possível declarar constantes na linguagem Go, diferente de uma variável as constantes não podem ter o seu valor alterado ao longo da execução do programa.
A declaração de uma constante é bem semelhante à forma de declaração de uma variável, a diferença é que utilizamos a palavra reservada const e as constantes devem ser imediatamente inicializadas.
package main
func main() {
const segundosEmUmMinuto int = 60
}
Estruturas condicionais e estruturas de repetição
As estruturas condicionais e de repetição são fundamentais e vem para nos ajudar no reaproveitamento de código.
As estruturas condicionais possibilitam ao programa tomar decisões e alterar o seu fluxo de execução. Isso possibilita ao desenvolvedor o poder de controlar quais são as tarefas e trechos de código executados de acordo com diferentes situações, como os valores de variáveis. Algumas estruturas condicionais no Go são o if/else e o switch/case.
Abaixo temos um exemplo simples da utilização do if/else. Nele verificamos se a pessoa é maior ou menor de idade, dependendo do valor que contiver na variável idade.
package main
import "fmt"
func main() {
idade := 18
if idade >= 18 {
// Se a váriavel idade for maior ou igual à 18 esse trecho de código será executado
fmt.Println("Você é maior de idade!")
} else {
// Se a váriavel idade não for maior ou igual à 18 esse trecho de código será executado
fmt.Println("Você é menor de idade!")
}
}
As estruturas de repetição, também conhecidas como loops (laços), são utilizadas para executar repetidamente uma instrução ou bloco de instrução enquanto determinada condição estiver sendo satisfeita. O Go possui apenas uma estrutura de repetição, a estrutura for, porém, ela pode ser usada de diversas formas.
Vejamos um exemplo abaixo utilizando o for. Aqui teremos uma variável começando em zero, onde, a cada rodada, ela irá somar +1. Isso irá se repetir até que a variável chegue até 10, encerrando assim esse bloco.
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
fmt.Println("A váriavel i agora é:", i)
}
}
Orientação a objetos
O Go possui suporte para a orientação a objetos? No FAQ (Frequently Asked Questions) da documentação da linguagem, existe um tópico dedicado a essa questão. Lá é dito que a Golang possui um suporte limitado a orientação a objetos, ou seja, a linguagem possui suporte a orientação a objetos, porém, não da mesma maneira que estamos acostumados em outras linguagens.
Quando falamos de orientação a objetos na linguagem Go, nós não temos o conceito de classes como estamos acostumados, o que existe no Go são as structs. Essas structs são tipos de dados compostos que permitem agrupar diferentes tipos de valores relacionados em um único objeto. Uma struct em Go é definida usando a palavra-chave type seguida pelo nome da struct e uma lista de campos, que consistem em um nome e um tipo. Por exemplo:
type Pessoa struct {
Nome string
Idade int
Email string
}
Uma vez que uma struct é definida, podemos criar variáveis desse tipo, preenchê-las com valores e acessar os campos usando a notação de ponto. Por exemplo:
func main() {
pessoa := Pessoa{
Nome: "João",
Idade: 25,
Email: "[email protected]",
}
fmt.Println("Nome:", pessoa.Nome)
fmt.Println("Idade:", pessoa.Idade)
fmt.Println("Email:", pessoa.Email)
}
Gerenciamento de dependências no Go
Um gerenciador de dependências é uma ferramenta que ajuda a gerenciar as bibliotecas e pacotes que um projeto precisa para funcionar corretamente. Ele permite que as dependências sejam facilmente instaladas, atualizadas e removidas, sem a necessidade de gerenciá-las manualmente.
Isso pode economizar muito tempo e evitar erros de compatibilidade entre diferentes versões de bibliotecas. Em Go, o gerenciador de dependências padrão é o Go Modules (Módulos Go), que é uma ferramenta integrada ao Go e facilita muito o processo de gerenciamento de dependências.
Primeiramente, para podermos realizar as ferramentas de gerenciamentos de dependências em projetos Go, precisamos inicializar um módulo em nosso projeto. Para isso executamos o seguinte comando:
go mod init nome-do-modulo
Então caso queiramos criar um módulo chamado github.com/cafecodificado/meu-projeto-go, executaremos o seguinte comando:
go mod init github.com/cafecodificado/meu-projeto-go
Para encontrar um pacote para usar em um projeto Go, podemos pesquisar em repositórios públicos como o GitHub ou o pkg.go.dev. O pkg.go.dev é uma ferramenta específica para a documentação de pacotes e bibliotecas em Go, e pode ser uma fonte útil para encontrar pacotes relacionados a uma funcionalidade específica.
Uma vez que tenhamos encontrado um pacote que vamos utilizar, basta executar o seguinte comando:
go get nome-do-pacote
Então, se vamos instalar o pacote github.com/google/uuid, por exemplo, precisaremos executar o comando:
go get github.com/google/uuid
Conclusão
Em suma, a linguagem Go é uma opção poderosa e eficiente para desenvolvedores que buscam uma linguagem de programação moderna e escalável. Com suas características distintas, biblioteca padrão abrangente e gerenciador de dependências integrado, o Go oferece uma experiência de desenvolvimento agradável e produtiva. Se você está começando a explorar o Go ou já é um desenvolvedor experiente, essa linguagem certamente merece sua atenção.
Por fim, caso queira aprender mais sobre a Golang e sua infinidade de recursos saiba que aqui na TreinaWeb temos o curso Go Básico que possui 05h30 de vídeo e um total de 37 exercícios.
Veja quais são os tópicos abordados durante o curso Go Básico:
Compreender a sintaxe básica da Golang;
Compreender conceitos básicos envolvidos na Go, como ponteiros de memória;
Utilizar as estruturas básicas da linguagem, como declaração de variáveis;
Utilizar as principais estruturas de conjuntos da Go, como arrays, slices e maps;
Entender as principais funções na Golang que são built-in, como make(), new(), panic(), recover() e defer;
Organizar o código em pacotes e utilizar os principais pacotes disponibilizados pela linguagem;
Entender como podemos utilizar concorrência com a Golang, inclusive com técnicas como os channels;
Entender o que são as structs na Go e como podemos utilizar um pouco de orientação a objetos com a linguagem;
Realizar operações de I/O no sistema operacional, como a criação e escrita de arquivos.
Leia também "Blindando a arquitetura de software"
Guia da linguagem Go