A linguagem Go nos permite realizar a conversão(casting) dos tipos de dados primitivos. Além do cast, vamos ver também como descobrir o tamanho, o tipo de variáveis e também como renomear tipos de dados.

O assunto casting implícito e explícito também foram visto em Tutorial C: Casting

Assim como em outras linguagens, Golang possui a característica de casting de tipos de dados. Porém, a linguagem Go não permite a conversão implícita entre tipo de dados fazendo uma atribuição direta.

Exemplo 1: Simular casting implícito em C
//2 bytes de tamanho
var valor1 uint16 = 256

//1 byte de tamanho
var valor2 uint8 = 255

//atribuição
valor1 = valor2 //Erro!
Saída
./prog.go:14:11: cannot use valor2 (variable of type uint8) as uint16 value in assignment

Para a conversão entre tipos precisamos de realizar o operador de conversão/casting de cada tipo:

Sintaxe
tipo_dado(valor)
Exemplo 2
var valor1 uint16 = 256
var valor2 uint8 = 0
valor2 = uint16(valor1) //conversão usando cast
Saída
-

Como o tipo de dado uint8 armazena apenas 1 byte, no casting acima, apenas o último byte do inteiro foi atribuído a variável valor2 resultando em um valor 0.

Para converter valores float, também é feita da mesma forma. Podemos por exemplo recuperar a parte inteiro de um valor float como abaixo:

Sintaxe
tipo_dado(valor)
Exemplo 2
var valor_float float32 = 10.99
var valorInt = uint32(valor_float) //parte inteira 10
var decimal float32 = valor_float - valorInt;
Saída
-

No casting visto acima pode haver perda perdas de dados quando os tipos envolvidos possuem tamanhos de armazenamento diferentes. Abaixo uma tabela resumido do que foi dito:

Origem Tamanho(bytes) Destino Tamanho(bytes) Dados perdidos(bytes)
int64 8 int32 4 4
int32 8 int6 2 2
int16 16 int8 2 1
float32 4 int32 4 parte decimal

A tabela acima possui um pequeno exemplo da conversão de tipos para exemplificar o casting com perda de dados. Baseado nos tipo de dados já estudados é possível relacionar a quantidade de dados perdidos nesse tipo de conversão.

A linguagem Go, assim como algumas outras linguagens, fornecem uma forma de descobrirmos o tamanho de nossas variáveis. Para descobrir esse tamanho, utilizamos o função len:

Sintaxe
len(variavel)
Exemplo 3
package main
import "fmt"

func main() {

	var nome string = "string"
	var cod int = len(nome)
	fmt.Printf("tamanho: %d", cod)
}
Saída
tamanho: 6

O uso da função len é importante não só para descobrir o tamanho de nossas variáveis, como também servem como base para percorrer o conteúdo de strings, vetores e outros tipos de dados em conjunto com comandos de repetição.

O retorno da função len deve ser interpretada de acordo com o tipo de dados que estamos utilizando, como nos tipos listados abaixo:

Tipo Retorno
Vetor Número de elementos
String Número de bytes utilizados
int Número de bytes utilizados

Os tipos numérico padrão de Go, int32, uint8 e outros podem ser utilizados com a função len, porém, como os tamanho são conhecidos pelo próprio nome dos tipos não há muita necessidade de utilizar a função.

Para descobrir o tipo de dados de uma variável em tempo de execução, é necessário utilizar o package reflect. O método utilizado em questão é o método TypeOf.

Sintaxe
reflect.TypeOf(nome_variavel)

Como Go utiliza inferência de dados, esse método pode vir a ser útil em situações que precisamos validar o tipo de uma variável.

Exemplo 4
package main

import (
	"fmt"
	"reflect" //TypeOf
)

func main() {

	var teste uint64 = 1
	fmt.Println("test = ", reflect.TypeOf(teste))
}
Saída
test =  uint64

A linguagem Go, possibilita a redefinição de um tipo de dados. Utilizamos o comando type para "criarmos" novos tipos de dados a partir dos tipos já existentes. Para a declaração, precisamos chamar o construtor do tipo.

Sintaxe
type novo_tipo = tipo_existente
Exemplo 5
package main
import "fmt"

func main() {

	type meu_tipo = uint8
	var teste meu_tipo = 100
	fmt.Printf("%d", teste)
}
Saída
100

  1. 16/09/2024 - revisão 2 - Ajustes gramaticais, em Ex. 2 e sintaxe type
  2. 02/10/2023 - revisão 1 - Correção em referências, erros gramaticais
  3. 21/08/2023 - versão inicial