Conversão de string para número em Go: 5 armadilhas e suas soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

«Convert string to integer type in Go?» — a pergunta que atormenta os iniciantes

\n\n

Todo mundo que começou a programar em Go, mais cedo ou mais tarde, esbarrou em um muro: precisa pegar uma string como "42" e transformá-la em um número legítimo 42. Parece simples, não é? Mas é exatamente essa pergunta que reúne milhares de visualizações no Stack Overflow, com dezenas de comentários sobre erros típicos. Por que isso acontece?

\n\n

Em Go, não existe o familiar int("42") do Python ou JavaScript. Em vez disso, temos o poderoso, mas rigoroso, pacote strconv, que força você a pensar sobre o que pode dar errado. E isso é correto: você não pode simplesmente "jogar" uma string em um int, porque a string pode estar corrompida, vazia ou conter espaços extras.

\n\n

Neste artigo, vamos analisar a conversão de string para número em Go com exemplos reais, passar pelas armadilhas que até desenvolvedores experientes enfrentam e fornecer padrões de código funcionais. Vamos lá!

\n\n

1. A ferramenta principal: o pacote strconv

\n\n

Na biblioteca padrão do Go, a conversão de strings é feita pelo pacote strconv. Ele possui três funções principais para converter uma string em um número inteiro:

\n\n
    \n
  • Atoi(s string) (int, error) — a opção mais simples, converte a string em int (a largura de bits depende da plataforma: 32 ou 64 bits).
  • \n
  • ParseInt(s string, base int, bitSize int) (int64, error) — oferece controle total: base do sistema numérico (10, 16, 2) e largura de bits (0, 8, 16, 32, 64).
  • \n
  • ParseUint(s string, base int, bitSize int) (uint64, error) — o mesmo, mas para números sem sinal.
  • \n
\n\n

O erro mais comum é ignorar o erro retornado. Vamos ver o que acontece.

\n\n

Exemplo 1: Ignoramos o erro — obtemos um bug

\n\n
package main\n\nimport (\n    "fmt"\n    "strconv"\n)\n\nfunc main() {\n    s := "123abc"\n    num, _ := strconv.Atoi(s) // Erro engolido!\n    fmt.Println(num)          // Saída: 0 — e você nem saberá que algo deu errado\n}\n
\n\n

Em Go, não há exceções; o erro é um valor. Se você o ignorar (_), obterá o valor zero (0) e passará horas depurando, imaginando por que seu programa está se comportando de forma estranha. Sempre trate o erro!

\n\n

2. Top 5 erros ao converter string em int em Golang

\n\n

Analisamos as perguntas no Stack Overflow e destacamos os problemas mais comuns. Aqui estão eles:

\n\n

Erro nº1: Espaços e caracteres invisíveis

\n\n

A string " 42 " ou "42\\n" — Atoi retornará um erro. Go não tolera caracteres extras, ao contrário de algumas linguagens que automaticamente fazem trim na string.

\n\n
s := " 42 "\nnum, err := strconv.Atoi(s)\nif err != nil {\n    fmt.Println("Erro:", err) // strconv.Atoi: parsing " 42 ": invalid syntax\n}\n
\n\n

Solução: use strings.TrimSpace() antes da conversão.

\n\n
import "strings"\n\ns := " 42 "\ns = strings.TrimSpace(s)\nnum, err := strconv.Atoi(s)\nif err == nil {\n    fmt.Println(num) // 42\n}\n
\n\n

Erro nº2: String vazia

\n\n

Uma string vazia "" também é um erro. Muitos iniciantes esperam que uma string vazia se transforme em 0, mas não é o caso.

\n\n
num, err := strconv.Atoi("")\n// err: strconv.Atoi: parsing "": invalid syntax\n
\n\n

Solução: verifique o comprimento da string ou trate o erro explicitamente, atribuindo um valor padrão.

\n\n

Erro nº3: Estouro (overflow)

\n\n

Se a string contém um número que não cabe no tipo selecionado, Atoi ou ParseInt retornarão o erro ErrRange e o valor máximo/mínimo para aquele tipo.

\n\n
s := "99999999999999999999" // maior que int64\nnum, err := strconv.ParseInt(s, 10, 64)\nif er                

Blogs

Book Recommendations