Tipos Numéricos, Strings, Runes e Fatias de Bytes
Os tipos embutidos do Go separam números de largura fixa, texto UTF-8, pontos de código Unicode (runes) e bytes brutos.
Busque em todas as páginas da documentação
Os tipos embutidos do Go separam números de largura fixa, texto UTF-8, pontos de código Unicode (runes) e bytes brutos.
Misturá-los sem conversão é uma fonte comum de erros de "off-by-one" e de codificação.
Inteiros e floats têm tamanhos explícitos; constantes sem tipo se adaptam ao contexto.
Strings são sequências de bytes UTF-8 imutáveis.
Uma rune é um alias para int32 representando um ponto de código Unicode.
Use []byte para dados binários e []rune quando precisar de operações de texto indexadas por caractere.
Cartão de receita de referência rápida - pronto para copiar e colar.
package main
import (
"fmt"
"strconv"
"unicode/utf8"
)
func main() {
s := "café"
fmt.Println(utf8.RuneCountInString(s)) // contagem de runes: 4
n, err := strconv.Atoi("42")
if err != nil {
panic(err)
}
fmt.Println(n + 1)
}Quando usar isso:
utf8.RuneCountInString, não com len(string).strconv, não com fmt.Sscanf, para obter erros claros.int64(x) ao aumentar ou diminuir a largura.string e []byte como distintos, a menos que esteja copiando para APIs.package main
import (
"fmt"
"strconv"
"unicode/utf8"
)
func main() {
price := "19.99"
amount, err := strconv.ParseFloat(price, 64)
if err != nil {
fmt.Println("erro de parse:", err)
return
}
title := "Hello, 世界"
fmt.Println("bytes:", len(title))
fmt.Println("runes:", utf8.RuneCountInString(title))
for i, r := range title {
fmt.Printf("índice de byte %d: %U\n", i, r)
}
b := []byte(title)
b[0] = 'h' // modifica a cópia apenas se você reatribuir a string a partir de b
fmt.Println(string(b))
}O que isso demonstra:
strconv.ParseFloat para conversão de string para número com erros.len em strings mede bytes UTF-8, não runes.range sobre strings decodifica runes e retorna índices de byte.[]byte(string) aloca uma cópia mutável de bytes.int, int8..int64, uint, uint8..uint64), floats (float32, float64) e complex64/complex128.int e uint depende da plataforma (32 ou 64 bits); prefira tipos com tamanho definido para serialização.[]byte copia, a menos que use unsafe (evite).U+FFFD ao iterar.| Tipo | Uso Típico | Overflow |
|---|---|---|
int | índices, comprimentos | envolve em aritmética não verificada |
int64 | IDs, timestamps | o mesmo |
uint8 | bytes brutos | o mesmo |
float64 | medições | erros de arredondamento IEEE |
big.Int (pacote) | precisão arbitrária | não embutido |
| Operação | Código | Resultado |
|---|---|---|
| Comprimento do byte | len(s) | Contagem de bytes UTF-8 |
| Contagem de runes | utf8.RuneCountInString(s) | Pontos de código Unicode |
| Iterar runes | for i, r := range s | índice de byte + rune |
| Fatia de bytes | []byte(s) | cópia mutável |
| Fatia de runes | []rune(s) | uma rune por ponto de código |
// strconv é a ponte idiomática entre string e número
i, err := strconv.ParseInt("ff", 16, 64)
f := strconv.FormatFloat(3.5, 'f', 2, 64)
// literal de rune vs byte
var letter rune = 'A' // ponto de código int32
var raw byte = 'A' // uint8 ASCIIlen para contagem de caracteres - "é" tem len 2 em UTF-8. Correção: utf8.RuneCountInString ou range.int32(x) silenciosamente - int64 grande para int32 envolve. Correção: verifique os limites antes da conversão.[]byte derivado de string - Seguro para a fatia, mas reatribuir string(b) cria uma nova string; o original não é alterado. Correção: trate a conversão como cópia.fmt.Sscanf para parsear - Relatório de erros fraco vs strconv. Correção: prefira as funções strconv.Parse*.== - Problemas com 0.1+0.2. Correção: comparação com epsilon ou inteiros em centavos.s[i] é um byte, não uma rune; pode dividir sequências multibyte. Correção: use range ou converta para []rune para indexação.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
[]byte | IO, criptografia, formatos de rede | Você precisa de operações de caractere |
[]rune | Reverter, inserir por índice de caractere | A memória é importante para texto ASCII enorme |
strings.Builder | Construir strings em loops | Poucas concatenações (+ está bom) |
math/big | Dinheiro decimal, criptografia | Contadores simples |
type rune = int32 - um ponto de código Unicode.
Literais de rune como '世' são digitados como constantes untyped rune.
A imutabilidade permite o compartilhamento seguro e fatias de substrings eficientes que referenciam o mesmo array subjacente.
As mutações ocorrem através de []byte ou strings.Builder.
strconv.Itoa(42)
strconv.FormatInt(42, 10)
fmt.Sprintf("%d", 42) // aloca mais; bom para logsSão tipos idênticos; byte é um alias para uint8 usado para dados ASCII/binários.
Bytes inválidos são substituídos pela rune utf8.RuneError (U+FFFD) e largura 1.
Não - use unidades inteiras menores (centavos) ou shopspring/decimal / big.Rat para aritmética exata.
Constantes sem tipo explícito (como 42 ou 3.14) assumem o tipo exigido pelo contexto com int/float64/complex128 padrão.
Use strings.TrimSpace e utf8.ValidString ao validar texto do usuário.
Evite remover por contagens de bytes brutos para larguras de exibição.
for _, b := range []byte(s) retorna bytes, não runes.
Use for _, r := range string(b) ou utf8.DecodeRune.
Atalho para ParseInt(s, 10, 0) retornando int.
Ele gera erro em caso de overflow para o tamanho int da plataforma.
Use strings.Builder em loops; o compilador otimiza cadeias simples de + com poucas partes.
json.Marshal codifica ambos como strings ou base64 dependendo do tipo do campo.
Escolha um tipo em suas structs de API deliberadamente.
[]byte e []runeVersões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 18 de jul. de 2026