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.
Curso Lógica Orientada a Objetos - Avançando na Orientação a Objetos
Conhecer o cursoCaracterí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 tipoint
, mas só recebe valores sem sinal; -
byte
: é um atalho para o tipouint8
; -
rune
: é um atalho para o tipoint32
, geralmente o tiporune
é 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
Curso Go Básico
Conhecer o cursoA 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
Curso Python - Fundamentos
Conhecer o cursoA 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.