En Go, no existe la conversión implícita entre tipos distintos. Si intentas sumar un int con un int64, el compilador se detendrá inmediatamente y te lanzará un error. Esta decisión de diseño es fundamental para evitar errores de overflow (desbordamiento) y truncamiento que en otros lenguajes como C o Java ocurren de forma silenciosa y son extremadamente difíciles de depurar.
Para realizar una operación entre tipos diferentes, debes usar la conversión explícita mediante la sintaxis T(v), donde T es el tipo al que quieres convertir y v es el valor original. Usarás esto constantemente cuando necesites operar con variables de distinta precisión numérica o cuando necesites transformar un string en un número (usando el paquete strconv). Si ignoras esta regla, el compilador te protegerá, pero si realizas una conversión de un tipo grande a uno más pequeño (por ejemplo, de int64 a int32) y el valor es demasiado grande para el nuevo tipo, el programa compilará pero el valor se “recortará” de forma inesperada durante la ejecución (runtime), alterando la lógica de tu aplicación sin previo aviso.
package main
import (
"fmt"
"strconv"
)
func main() {
// 1. Operaciones entre tipos distintos
var edad int = 30
var timestamp int64 = 1715673600
// error: fmt.Println(edad + timestamp)
// El compilador no permite sumar tipos diferentes automáticamente.
// Convertimos edad a int64 para que ambos operandos sean del mismo tipo.
suma := int64(edad) + timestamp
fmt.Printf("Suma segura: %d\n", suma)
// 2. Conversiones que pierden información (Peligro)
var numeroGrande int64 = 3000000000 // Mayor al máximo de un int32
// Convertimos a int32 de forma explícita
numeroPequeño := int32(numeroGrande)
fmt.Printf("Original: %d, Truncado: %d\n", numeroGrande, numeroPequeño)
// 3. Conversión de strings a números
input := "42"
// strconv.Atoi es la forma estándar de convertir string a int
valor, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Error al convertir:", err)
return
}
fmt.Printf("String convertido a int: %d\n", valor)
// Para convertir un número a string usamos strconv.Itoa
texto := strconv.Itoa(valor)
fmt.Printf("Int convertido a string: %s\n", texto)
}
En el código anterior, verás que para sumar edad y timestamp, primero aplicamos int64(edad). Esto es necesario porque Go no asume que quieres que el int se convierta en int64; tú debes decírselo explícitamente para que el compilador pueda validar que la operación es segura.
Fíjate en la sección del “Número Grande”. Aunque escribimos int32(numeroGrande), Go no se detiene porque el valor 3000000000 es demasiado grande para los 32 bits de un int32 (que llega hasta aproximadamente 2,147 millones). El resultado es un valor basura debido al truncamiento de bits; el código compila perfectamente, pero el dato es erróneo.
Finalmente, para el caso de los string, no puedes simplemente hacer int(input). Go requiere el uso del paquete strconv. La función strconv.Atoi devuelve dos valores: el número convertido y un posible error. Es una buena práctica verificar siempre ese error antes de usar el resultado.
El error frecuente
var grande int64 = 5000000000 pequeño := int32(grande) // El código compila sin problemas fmt.Println(pequeño) // Imprimirá un valor inesperado debido al truncamiento
El error no es de sintaxis, sino de lógica. La conversión de un tipo con mayor rango a uno de menor rango es legal para el compilador, pero puede corromper tus datos en ejecución si el valor excede los límites del tipo destino.
N° 21