Desenvolvimento Back-end Go

Conhecendo variáveis e constantes na Golang

Conheça neste artigo os tipos de dados presentes e a sintaxe para que possamos declarar variáveis e constantes na Golang.

há 1 ano 5 meses


Você sabia que a TreinaWeb é a mais completa escola para desenvolvedores do mercado?

O que você encontrará aqui na TreinaWeb?

Conheça os nossos cursos

A Go (Golang) é uma linguagem de programação recente se comparada com outras linguagens presentes no mercado. Foi desenvolvida pelo Google, bastante performática e que vem se popularizando bastante nos últimos anos. Continuando com a nossa série de artigos sobre essa linguagem, nós iremos falar sobre as variáveis e constantes na Golang.

Flutter  - Trabalhando com recursos de hardware
Curso Flutter - Trabalhando com recursos de hardware
Conhecer o curso

Características de tipagem

A Golang é uma linguagem de tipagem estática, ou seja, existe um sistema de tipos bem definido e validado em tempo de compilação. Para isso, é necessário definir tipos para as variáveis e constantes que são criadas.

Mas é importante frisar que a linguagem Go possui o recurso de inferência de tipos, o que permite que os tipos das variáveis e constantes sejam definidos de maneira automática pelo compilador, lembrando que o recurso de inferência de tipos não faz com que a linguagem se torne dinamicamente tipada.

Certamente existem algumas vantagens atreladas à utilização de sistemas de tipos estáticos, como, equívocos de tipagem são geralmente percebidos com mais facilidade, além de que os processos de refatoração tendem a ser mais a prova de erros. Se acaba sendo necessário trocar o tipo de um parâmetro de uma função, por exemplo, o código não irá compilar até que todos os locais que referenciam a função passem a especificar o tipo correto.

Além disso, a Go, também, é fortemente tipada, isso quer dizer que para a Go os tipos dos dados importam, ou seja, a 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.

Tipos de dados padrões na Go

Como cada informação com a qual lidamos possui um tipo específico que melhor a representa, devemos escolher corretamente o tipo de variável que vamos utilizar. Portanto, é fundamental conhecer os tipos de dados que a linguagem nos oferece.

A seguir são apresentados os diversos tipos de dados da Go, a faixa de valores que ela aceita e quanto espaço uma variável desse tipo ocupa na memória.

Tipos numéricos

A fim de armazenar números sem parte fracionária (algarismos após a vírgula), temos os valores numéricos inteiros. Note abaixo que cada tipo aceita uma faixa de valores, e que quanto maior essa faixa, maior também é o espaço ocupado em memória. Veja ainda que os tipos cujo nome começa com a letra “u” (de “unsigned” - sem sinal), não aceitam valores negativos, mas suportam uma faixa maior de valores positivos.

Tipo Faixa de valores Tamanho
int8 -128 a 127 8 bits
uint8 0 a 255 8 bits
int16 -32.768 a 32.767 16 bits
uint16 0 a 65.535 16 bits
int32 -2.147.483.648 a 2.147.483.647 32 bits
uint32 0 a 4.294.967.295 32 bits
int64 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 64 bits
uint64 0 a 18.446.744.073.709.551.615 64 bits

Além dos tipos descritos na tabela acima, temos alguns outros tipos para valores inteiros que servem como “atalhos” da própria linguagem. São eles:

  • 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;
  • byte: é um atalho para o tipo uint8;
  • rune: é um atalho para o tipo int32, geralmente o tipo rune é utilizado para armazenar valores numéricos que representam caracteres Unicode.

Tipos numéricos de ponto flutuante

Os tipos de ponto flutuante representam os números “reais”, ou seja, aqueles que podem possuir uma parte fracionária.

Tipo Faixa de valores Precisão Tamanho
float32 ±1,5 x 10−45 para ±3,4 x 1038 ~6 a 9 dígitos 32 bits
float64 ±5.0 × 10−324 para ±1.7 × 10308 ~15 a 17 dígitos 64 bits

Tipo booleano

O tipo booleano é usado para armazenar valores que podem ser representados como Verdadeiro ou Falso (sem valores intermediários).

Tipo Faixa de valores Tamanho
bool true ou false 1 bit

Tipos textuais

Também é muito comum que precisemos lidar com textos. Para esses casos, de forma geral, os textos podem ser armazenados pelo tipo string.

Tipo Faixa de valores Tamanho
string Textos 8 bits por caractere

Em outras linguagens é comum termos o tipo char, utilizado para armazenar um único caractere. Na linguagem Go não possuímos esse tipo, porém, ele pode ser representado utilizando o tipo byte.

O tipo string é um conjunto de bytes, mas também pode possuir rune's, pois dentro de uma string pode haver caracteres Unicode.

Declarando variáveis

Go Básico
Curso Go Básico
Conhecer o curso

A declaração de variáveis na linguagem Go é feita com o uso da palavra reservada var. Basicamente, a sintaxe para declaração de uma variável é, var nomeDaVariavel tipo. No exemplo abaixo temos a declaração de uma variável chamada idade, do tipo int e logo em seguida é atribuído valor 18 (dezoito) para essa mesma variável.

package main

func main() {
	var idade int
	idade = 18
}

Também é possível realizar a definição e a inicialização da variável em uma mesma linha de código.

package main

func main() {
	var idade int = 18
}

Outro ponto interessante a ser ressaltado é que, quando uma variável é criada, mas não é inicializada de imediato, ela terá inicialmente um valor definido de maneira automática pelo compilador, esse valor é conhecido como zero-value (valor zero).

Cada tipo possui um diferente zero-value, por exemplo, o tipo int tem como zero-value o valor 0 (zero), já o tipo string tem como zero-value o valor "" (uma string vazia) e o tipo bool tem o valor false como zero-value.

Declarando constantes

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
}

Regras de nomeação de variáveis e constantes

Na Golang utilizamos como regra de nomeação de variáveis e constantes o formato camelCase.

Este formate determina que o nome das variáveis e constantes possuam um padrão em que, as palavras sejam definidas em letras minúsculas e, caso possua mais de uma palavra, os espaços serão removidos e a primeira letra das demais palavras serão colocadas em maiúsculo.

package main

func main() {
	var idade int = 18
	var idadeDoAluno int = 18
}

Mas também é possível utilizar o formato PascalCase, onde cada palavra terá a sua primeira letra em maiúsculo, mesma que seja a primeira palavra. O formato PascalCase só será utilizado quando queremos que uma variável ou constate seja acessível de fora do pacote onde a mesma foi definida.

package main

func main() {
	var Idade int = 18
	var IdadeDoAluno int = 18
}

Além disso, temos algumas outras regras que devem ser respeitadas, são elas:

  • As variáveis não devem contar com caracteres especiais em seu nome. A única exceção é o underscore (_), mas seu uso não é recomendado;
  • Os nomes devem ser declarativos e autoexplicativos;
  • As variáveis são case-sensitive. Isso quer dizer que “nomeDoAutor” difere de “nomeDoautor”, de “NomeDoAutor” e de “nomedoautor”, por exemplo.

Inferência de tipos

Wordpress - Personalização do tema Avada
Curso Wordpress - Personalização do tema Avada
Conhecer o curso

A inferência de tipos é uma técnica que permite que os tipos das variáveis sejam definidos de forma automática pelo compilador a partir do seu contexto, isso quer dizer que o compilador irá atribuir de forma automática o tipo da variável no momento de sua declaração, verificando o tipo de dado que está sendo atribuído para a mesma.

Na linguagem Go podemos utilizar a inferência de tipos ao simplesmente realizar a declaração e atribuição da variável ou constante e omitir o seu tipo.

package main

func main() {
	var idade = 18
	const IdadeDoAluno = 18
}

Importante frisar que a inferência de tipos não retira o status de linguagem estaticamente tipada da Golang, pois uma vez que o tipo foi definido, mesmo que de forma automática, a mesma não pode ter o seu tipo alterado ao longo da execução do programa, além disso, é importante notar que a inferência de tipos só é possível de ser realizada caso a variável seja declarada e tenha seu valor inicial atribuído no mesmo momento.

package main

func main() {
	var idade
	idade = 18
}

O código acima não irá compilar e irá produzir um erro de compilação, pois no momento da criação da variável o compilador não é capaz de “adivinhar” qual deve ser o tipo da mesma, uma vez que não há o processo de atribuição do seu valor inicial no momento de sua declaração.

Por fim, a Golang também possui a sintaxe :=, que se comporta como um atalho para realizar a declaração e a inicialização de uma variável sem a necessidade da palavra reservada var.

package main

func main() {
	idade := 18
}

A expressão acima é o mesmo que var idade = 18. Inclusive essa forma de realizar a declaração e inicialização de uma variável é muito comum de se ver em códigos Go.

Conclusão

Como vimos nesse artigo, a Go possui uma tipagem estática e forte, o que faz com que as variáveis não possam ter seu tipo alterado ao longo da execução do programa e também que a Go não irá realizar conversão de tipos de forma automática.

Por fim, caso queira aprender mais sobre a Go 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 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.

Autor(a) do artigo

Cleyson Lima
Cleyson Lima

Professor, programador, fã de One Piece e finge saber cozinhar. Cleyson é graduando em Licenciatura em Informática pelo IFPI - Campus Teresina Zona Sul, nos anos de 2019 e 2020 esteve envolvido em vários projetos coordenados pela secretaria municipal de educação da cidade de Teresina, onde o foco era introduzir alunos da rede pública no mundo da programação e robótica. Hoje é instrutor dos cursos de Spring na TreinaWeb, mas diz que seu coração sempre pertencerá ao Python.

Todos os artigos

Artigos relacionados Ver todos