Paradoja: Go no tiene INT_MAX, pero no es un problema
\n\nSi vienes a Go desde el mundo de C++, Java o Python, seguramente te has encontrado con la situación de necesitar saber el valor máximo de un número entero. En C++ existe INT_MAX, en Python los límites son dinámicos, y en Go... te espera una sorpresa. En la biblioteca estándar no hay una constante como IntMax o MaxInt para el tipo int estándar. Y esto no es un error, sino una característica que afecta directamente al rendimiento de tu código.
La pregunta "The maximum value for an int type in Go" en Stack Overflow ha acumulado miles de visitas. Los desarrolladores buscan una respuesta, pero a menudo no entienden por qué Go está diseñado de esta manera. Analicemos esto de una vez por todas, y de paso aprendamos cómo conocer los límites de los números enteros ayuda a escribir programas más rápidos y seguros.
\n\nRespuesta corta: cómo obtener el máximo para int en Go
\n\nSi solo necesitas el número, usa las constantes del paquete math:
package main\n\nimport (\n "fmt"\n "math"\n)\n\nfunc main() {\n // Para int32 e int64 es sencillo\n fmt.Println("Max int32:", math.MaxInt32) // 2147483647\n fmt.Println("Min int32:", math.MinInt32) // -2147483648\n fmt.Println("Max int64:", math.MaxInt64) // 9223372036854775807\n fmt.Println("Min int64:", math.MinInt64) // -9223372036854775808\n\n // ¿Y con int normal?\n // ¡No existe la constante math.MaxInt!\n}\n\n¿Ves? Para int32 e int64 existen constantes, pero para int no. ¿Por qué? Porque int es un tipo dependiente de la plataforma. En sistemas de 32 bits equivale a int32, en sistemas de 64 bits a int64. Crear una constante única significaría romper la abstracción de la plataforma. Go prefiere la claridad.
Truco para perezosos: calcular MaxInt sobre la marcha
\n\nPero si realmente lo necesitas, puedes calcular el valor máximo mediante programación (aunque se considera una mala práctica):
\n\npackage main\n\nimport (\n "fmt"\n "math"\n)\n\nfunc main() {\n // Truco: usar desplazamiento de bits\n const MaxUint = ^uint(0)\n const MaxInt = int(MaxUint >> 1)\n const MinInt = -MaxInt - 1\n\n fmt.Println("Max int:", MaxInt) // 9223372036854775807 (en 64-bit)\n fmt.Println("Min int:", MinInt) // -9223372036854775808\n\n // Comprobamos: ¿coincide con math.MaxInt64?\n fmt.Println("¿Son iguales?", MaxInt == math.MaxInt64) // true en 64-bit\n}\n\nEsto funciona así: ^uint(0) da un número compuesto solo por unos (máximo para uint). Desplazarlo un bit a la derecha lo convierte en el valor máximo para int (elimina el bit de signo).
¿Por qué es importante para el rendimiento?
\n\nAhora pasemos a lo más interesante: la optimización. Conocer los límites de los números enteros en Go es fundamental cuando escribes código de alta carga. Aquí tienes tres escenarios donde esto se manifiesta.
\n\n1. Evitar comprobaciones innecesarias de desbordamiento
\n\nGo no genera un panic en caso de integer overflow (desbordamiento de enteros): el valor simplemente "da la vuelta". Esto se hizo deliberadamente por rendimiento. Pero si no conoces los límites, puedes tener un error difícil de detectar.
\n\npackage main\n\nimport "fmt"\n\nfunc main() {\n var a int8 = 127\n a++\n fmt.Println(a) // -128 — ¡desbordamiento sin error!\n\n // Si escribes un contador, controla los límites\n for i := 0; i < 1000; i++ {\n // Si i es int8, será un bucle infinito (desbordamiento)\n }\n}\n\nConsejo de optimización: si sabes con certeza que el valor no supera math.MaxInt32, usa int32 en lugar de int. En sistemas de 64 bits esto puede ahorrar memoria en slices y estructuras, y en sistemas de 32 bits puede acelerar la aritmética.