Conversão de tipos com Go
Fiquei responsável de desenvolver uma aplicação para descobrir qual seria o novo salário de um funcionário, baseado no aumento que ele recebeu. Esses valores são passados no formato de string, já que chegam de um formulário HTML.
Para saber o aumento precisamos multiplicar o salário pelo aumento(%) e fazer a divisão por 100, depois somamos esse valor obtido ao salário atual e temos o valor do novo salário.
package main
import (
"fmt"
)
func main() {
salario := "1000"
aumento := "20"
fmt.Println("O salário é", salario, "e o aumento de", aumento + "%")
}
Executando o código com o cálculo, obtive o seguinte resultado:
invalid operation: salario * aumento (operator * not defined on string)
Esso erro indica que o operador de multiplicação não pode ser aplicado, pois variáveis são do tipo string, então o que precisamos é encontrar uma maneira de fazer uma conversão de tipos.
Conhecendo o pacote strconv
A linguagem Go nos fornece um meio de conversão entre diferentes tipos compatíveis, por exemplo strings para inteiro. Essas conversões são feitas pelo pacote strconv
, vamos ver como elas funcionam ?
Convertendo um tipo String para um tipo int
Tentei converter um tipo string para um tipo int, usamos o método Atoi
do pacote strconv
da seguinte forma:
salario := 1000
salarioConvertido := strconv.Atoi(salario)
Converti também o aumento para inteiro e usei as variáveis convertidas para executar o código:
package main
import (
"fmt"
"strconv"
)
func main() {
salario := "1000"
aumento := "20"
salarioConvertido := strconv.Atoi(salario)
aumentoConvertido := strconv.Atoi(aumento)
fmt.Println("O salário é", salario, "e o aumento de", aumento + "%")
novoSalario := ((salarioConvertido * aumentoConvertido) / 100) + salarioConvertido)
fmt.Println("O novo salário é", novoSalario)
}
E para minha surpresa, meu resultado foi:
assignment mismatch: 1 variable but strconv.Atoi returns 2 values
Que significa: Incompatibilidade de atribuição: 1 variável, mas strconv.Atoi retorna 2 valores.
Como assim 2 valores?
Um pouco sobre funções em GO
Acontece que essas e muitas outras funções em GO, podem retornar 1, 2, muitos ou nenhum valor. No caso da função Atoi
, temos 2 retornos: valor convertido e uma possível mensagem de erro, caso a conversão não seja feita.
Sabendo disso, adicionei o erro como segundo retorno da função e fiz uma checagem com um if
para tratar um possível erro que venha a acontecer.
func main() {
salario := "1000"
aumento := "20"
salarioConvertido, err := strconv.Atoi(salario)
if err != nil {
fmt.Println(err)
}
aumentoConvertido, err := strconv.Atoi(aumento)
if err != nil {
fmt.Println(err)
}
fmt.Println("O salário é", salario, "e o aumento de", aumento + "%")
novoSalario := ((salarioConvertido * aumentoConvertido) / 100) + salarioConvertido)
fmt.Println("O novo salário é", novoSalario)
}
E o resultado foi:
O salário é 1000 e o aumento de 20%
O novo salário é 1200
Você pode executar ou ver este código, clicando nesse link: https://play.golang.org/p/BT9Wc5XhBC0
Já sabemos como converter um tipo string para int com strconv.Atoi
, mas e se precisarmos converter um tipo inteiro para um tipo string?
Mas, e o contrário?
Agora que sabemos o valor do novo salário, precisamos retornar esse valor para o HTML no formato string.
Nesse caso, utilizamos outra função do mesmo pacote chamada strconv.Itoa
, conforme o exemplo abaixo:
package main
import (
"fmt"
"strconv"
)
func main() {
novoSalarioInt := 2019
salarioConvertido := strconv.Itoa(novoSalarioInt)
fmt.Println(numeroConvertido)
}
Você pode executar ou ver este código, clicando nesse link: https://play.golang.org/p/rh7_1e3Pmpz
Para saber mais
Caso o valor do aumento
ou do salário
seja um valor decimal, por exemplo 22.2
ou 2000.50
, podemos utilizar a função strconv.Itoa
do mesmo pacote, para converter uma string para número decimal, conforme o exemplo abaixo:
salarioConvertido, err := strconv.ParseFloat(salario, 64)
if err != nil {
fmt.Println(err)
}
aumentoConvertido, err := strconv.ParseFloat(aumento, 64)
if err != nil {
fmt.Println(err)
}
Para esse tipo de conversão, devemos informar o tamanho do tipo convertido, conforme a imagem abaixo:
imagem
Você pode executar ou ver este código, clicando nesse link: https://play.golang.org/p/0WWp1oxv2NQ
Se ficou interessado em como o Go funciona e como você pode utilizá-lo melhor, aqui na Alura temos cursos de Go. Nela, você aprenderá como utilizar esse e outros recursos, desta incrível linguagem e muito mais.