Em linguagens fortemente tipadas, muitas vezes precisamos fazer conversões dos tipos das nossas variáveis para poder executar algum tipo de função interna. Uma das conversões mais comum que acontecem é a de int ou float para string e vice versa.
Também pode acontecer conversões dentro do mesmo “grupo”, por exemplo de int32 para int16. Porém, embora pertençam ao mesmo “grupo”, temos que ficar atentos ao tamanho máximo que cada um desses tipos comportam, pois caso o valor extrapole a capacidade do tipo destino, a conversão irá dar errado.
var i32 int32 = 10 i16 := int16(i32) fmt.Printf("%T - %d", i16, i16)
No exemplo acima, tudo funcionará bem, pois 10 é um valor que os dois tipos de dados comportam. Agora se o valor de i32
fosse 32769, a conversão para int16 retornaria -32767, e se fosse algo maior ainda, como por exemplo 132769, a conversão retornaria 1697.
Isso vale também para conversões entre int e uint, float e int e etc… Por isso é muito importante conhecer as capacidades de cada um dos tipos que temos em Go. Se você ainda não viu, fizemos um post na semana passada abordando esse tema (link do post).
A maioria das conversões em Go podem ser feitas usando o tipo desejado como uma função, assim como vimos no primeiro exemplo.
Em caso de conversão de float para int, as casas decimais serão removidas, e no inverso, casas decimais serão adicionadas.
f := 10.52 fmt.Printf("%d", int32(f)) // 10 i := 15 fmt.Printf("%f", float32(i)) // 15.000000
Para lidar com conversões de bool, complex, float, int e uint para string e vice versa, devemos usar um package nativo do Go que chama strconv
.
Vamos para alguns exemplos:
s := strconv.FormatInt(100, 10) fmt.Printf("%T - %s", s, s)
O segundo parâmetro da função FormatInt
representa a base numérica queremos fazer a conversão. No exemplo usamos a decimal, mas poderíamos, por exemplo usar a binária.
s := strconv.FormatInt(100, 2) fmt.Printf("%T - %s \n", s, s) // string - 1100100 i, _ := strconv.ParseInt(s, 2, 32) fmt.Printf("%T - %d", i, i) // int64 - 100
Esse package fornece uma função Format para cada um dos tipos básicos, assim como uma função Parse, mudando somente a assinatura do método mediante o tipo de dados que estamos trabalhando.
s := strconv.FormatFloat(10.532, 'f', 2, 64) fmt.Printf("%T - %s \n", s, s) // string - 10.52
Como podemos ver no exemplo acima, passamos o número 10.532, mas como definimos que só queríamos 2 casas decimais (terceiro parâmetro da função), o retorno da conversão foi o valor 10.52.
Deixem suas dúvidas nos comentários ou na nossa comunidade do reddit.
Até a próxima!