Tipos Numéricos, Cadenas, Runas y Segmentos de Bytes
Los tipos integrados de Go separan números de ancho fijo, texto UTF-8, puntos de código Unicode (runas) y bytes crudos.
Busca en todas las páginas de la documentación
Los tipos integrados de Go separan números de ancho fijo, texto UTF-8, puntos de código Unicode (runas) y bytes crudos.
Mezclarlos sin conversión es una fuente común de errores de desajuste y codificación.
Los enteros y los flotantes tienen tamaños explícitos; las constantes sin tipo se adaptan al contexto.
Las cadenas son secuencias de bytes UTF-8 inmutables.
Una runa es un alias de int32 que representa un punto de código Unicode.
Usa []byte para datos binarios y []rune cuando necesites operaciones de texto indexadas por caracteres.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
package main
import (
"fmt"
"strconv"
"unicode/utf8"
)
func main() {
s := "café"
fmt.Println(utf8.RuneCountInString(s)) // conteo de runas: 4
n, err := strconv.Atoi("42")
if err != nil {
panic(err)
}
fmt.Println(n + 1)
}Cuándo usar esto:
utf8.RuneCountInString, no con len(string).strconv, no con fmt.Sscanf, para obtener errores claros.int64(x) al ampliar o reducir.string y []byte como distintos a menos que copies 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("error de análisis:", err)
return
}
title := "Hello, 世界"
fmt.Println("bytes:", len(title))
fmt.Println("runas:", utf8.RuneCountInString(title))
for i, r := range title {
fmt.Printf("índice de byte %d: %U\n", i, r)
}
b := []byte(title)
b[0] = 'h' // muta la copia solo si reasignas la cadena desde b
fmt.Println(string(b))
}Lo que esto demuestra:
strconv.ParseFloat para conversión de cadena a número con errores.len en cadenas mide bytes UTF-8, no runas.range sobre cadenas decodifica runas y produce índices de bytes.[]byte(string) asigna una copia mutable de bytes.int, int8..int64, uint, uint8..uint64), flotantes (float32, float64) y complex64/complex128.int y uint depende de la plataforma (32 o 64 bits); prefiere tipos con tamaño para la serialización.[]byte copia a menos que uses unsafe (evítalo).U+FFFD al iterar.| Tipo | Uso Típico | Desbordamiento |
|---|---|---|
int | índices, longitudes | se envuelve en aritmética no verificada |
int64 | IDs, marcas de tiempo | igual |
uint8 | bytes crudos | igual |
float64 | mediciones | errores de redondeo IEEE |
big.Int (paquete) | precisión arbitraria | no integrado |
| Operación | Código | Resultado |
|---|---|---|
| Longitud de bytes | len(s) | Conteo de bytes UTF-8 |
| Conteo de runas | utf8.RuneCountInString(s) | Puntos de código Unicode |
| Iterar runas | for i, r := range s | índice de bytes + runa |
| Segmento de bytes | []byte(s) | copia mutable |
| Segmento de runas | []rune(s) | una runa por punto de código |
// strconv es el puente idiomático entre cadenas y números
i, err := strconv.ParseInt("ff", 16, 64)
f := strconv.FormatFloat(3.5, 'f', 2, 64)
// literal de runa vs byte
var letter rune = 'A' // punto de código int32
var raw byte = 'A' // uint8 ASCIIlen para contar caracteres - "é" tiene len 2 en UTF-8. Solución: utf8.RuneCountInString o range.int32(x) silenciosamente - int64 grande a int32 se envuelve. Solución: verifica los límites antes de la conversión.[]byte derivado de una cadena - Seguro para el segmento, pero reasignar string(b) crea una nueva cadena; la original no cambia. Solución: trata la conversión como una copia.fmt.Sscanf para análisis - Informes de error débiles en comparación con strconv. Solución: prefiere las funciones strconv.Parse*.== - Problemas con 0.1+0.2. Solución: comparación con épsilon o enteros en centavos.s[i] es un byte, no una runa; puede dividir secuencias multibyte. Solución: usa range o convierte a []rune para indexar.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
[]byte | IO, criptografía, formatos de red | Necesitas operaciones de caracteres |
[]rune | Invertir, insertar por índice de carácter | La memoria importa para texto ASCII enorme |
strings.Builder | Construir cadenas en bucles | Pocas concatenaciones (+ está bien) |
math/big | Dinero decimal, criptografía | Contadores simples |
type rune = int32 - un punto de código Unicode.
Los literales de runa como '世' se tipifican como constantes untyped rune.
La inmutabilidad permite compartir de forma segura y crear segmentos de subcadenas eficientes que referencian el mismo array subyacente.
Las mutaciones se realizan a través de []byte o strings.Builder.
strconv.Itoa(42)
strconv.FormatInt(42, 10)
fmt.Sprintf("%d", 42) // asigna más memoria; está bien para logsSon tipos idénticos; byte es un alias para uint8 utilizado para datos ASCII/binarios.
Los bytes inválidos se reemplazan con la runa utf8.RuneError (U+FFFD) y un ancho de 1.
No - usa unidades enteras menores (centavos) o shopspring/decimal / big.Rat para aritmética exacta.
Las constantes sin tipo explícito (como 42 o 3.14) toman el tipo exigido por el contexto con int/float64/complex128 por defecto.
Usa strings.TrimSpace y utf8.ValidString al validar texto del usuario.
Evita recortar por recuentos de bytes crudos para anchos de visualización.
for _, b := range []byte(s) produce bytes, no runas.
Usa for _, r := range string(b) o utf8.DecodeRune.
Atajo para ParseInt(s, 10, 0) que devuelve int.
Genera un error por desbordamiento para el tamaño int de la plataforma.
Usa strings.Builder en bucles; el compilador optimiza cadenas simples de + con pocas partes.
json.Marshal codifica ambos como cadenas o base64 dependiendo del tipo de campo.
Elige un tipo deliberadamente en las estructuras de tu API.
[]byte y []runeVersiones de Stack: Esta página fue escrita para Go 1.26.x (GC por defecto Green Tea, go fix modernizers - verificar parche en la compilación), chi (última - verificar en la compilación), gin (última - verificar en la compilación), echo (última - verificar en la compilación), google.golang.org/grpc (última - verificar en la compilación), sigs.k8s.io/controller-runtime (última - verificar en la compilación), kubebuilder (última - verificar en la compilación), tinygo (última - verificar objetivos de placa en la compilación), wazero (última - verificar en la compilación), y golangci-lint (última - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026