Conversión de cadena a número en Go: 5 trampas y sus soluciones

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

«Convert string to integer type in Go?» — la pregunta que atormenta a los principiantes

\n\n

Cualquiera que haya empezado a programar en Go, tarde o temprano se ha topado con un muro: necesita tomar una cadena como "42" y convertirla en un número real 42. Parecería que podría ser más simple? Pero precisamente esta pregunta acumula miles de visitas en Stack Overflow, y debajo de ella — docenas de comentarios con errores típicos. ¿Por qué sucede esto?

\n\n

En Go no existe el familiar int("42") de Python o JavaScript. En su lugar — un potente pero estricto paquete strconv, que te obliga a pensar en lo que podría salir mal. Y esto es correcto: no puedes simplemente «pasar» una cadena a int, porque la cadena podría estar dañada, vacía o contener espacios adicionales.

\n\n

En este artículo analizaremos la conversión de cadena a número en Go con ejemplos reales, repasaremos los errores en los que incluso los desarrolladores experimentados tropiezan, y daremos plantillas de código funcionales. ¡Allá vamos!

\n\n

1. La herramienta principal: el paquete strconv

\n\n

En la biblioteca estándar de Go, la conversión de cadenas está a cargo del paquete strconv. Tiene tres funciones principales para convertir una cadena en un número entero:

\n\n
    \n
  • Atoi(s string) (int, error) — la opción más simple, convierte una cadena en int (el tamaño depende de la plataforma: 32 o 64 bits).
  • \n
  • ParseInt(s string, base int, bitSize int) (int64, error) — da control total: base del sistema numérico (10, 16, 2) y tamaño en bits (0, 8, 16, 32, 64).
  • \n
  • ParseUint(s string, base int, bitSize int) (uint64, error) — lo mismo, pero para números sin signo.
  • \n
\n\n

El error más popular es ignorar el error devuelto. Veamos a qué conduce esto.

\n\n

Ejemplo 1: Ignoramos el error — obtenemos un bug

\n\n
package main\n\nimport (\n    "fmt"\n    "strconv"\n)\n\nfunc main() {\n    s := "123abc"\n    num, _ := strconv.Atoi(s) // ¡Error tragado!\n    fmt.Println(num)          // Salida: 0 — y ni siquiera sabrás que algo salió mal\n}\n
\n\n

En Go no hay excepciones, el error es un valor. Si lo ignoras (_), obtendrás el valor cero (0) y perderás horas depurando, preguntándote por qué tu programa se comporta de manera extraña. ¡Siempre maneja el error!

\n\n

2. Top 5 errores al convertir string a int en Golang

\n\n

Analizamos las preguntas en Stack Overflow y destacamos los problemas más frecuentes. Aquí están:

\n\n

Error #1: Espacios y caracteres invisibles

\n\n

La cadena " 42 " o "42\\n" — Atoi devolverá un error. Go no tolera caracteres adicionales, a diferencia de algunos lenguajes que recortan automáticamente la cadena.

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

Solución: usa strings.TrimSpace() antes de la conversión.

\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

Error #2: Cadena vacía

\n\n

La cadena vacía "" — también es un error. Muchos principiantes esperan que una cadena vacía se convierta en 0, pero no es así.

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

Solución: verifica la longitud de la cadena o maneja el error explícitamente, asignando un valor por defecto.

\n\n

Error #3: Desbordamiento (overflow)

\n\n

Si la cadena contiene un número que no cabe en el tipo seleccionado, Atoi o ParseInt devolverán el error ErrRange y el valor máximo/mínimo para ese tipo.

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

Blogs

Book Recommendations