GoGuias

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.

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