Entre para a LISTA VIP da Black Friday

00

DIAS

00

HORAS

00

MIN

00

SEG

Clique para saber mais

Conversão de tipos com Go

Conversão de tipos com Go
Guilherme Lima
Guilherme Lima

Compartilhe

imagem de capa

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 ?

Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

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.

Guilherme Lima
Guilherme Lima

Guilherme é desenvolvedor de software formado em Sistemas de Informação e possui experiência em programação usando diferentes tecnologias como Python, Javascript e Go. Criador de mais de 30 cursos de diferentes áreas da plataforma com foco no treinamento de profissionais de TI, como Data Science, Python para web com Django e Django Rest, jogos com Javascript, Infraestrutura como código com Terraform e Ansible, Orientação a Objetos com Go. Além disso, é um dos instrutores da Imersão Dev da Alura.

Veja outros artigos sobre Programação