GoPrincipiante20 oct 2025

¡El Módulo Rebelde de Go! No siempre es como esperas... 🎩

snippet.go
package main

import "fmt"

func main() {
    fmt.Println("-5 / 2  =", -5 / 2)
    fmt.Println("-5 % 2  =", -5 % 2)
    fmt.Println("5 / -2  =", 5 / -2)
    fmt.Println("5 % -2  =", 5 % -2)
    fmt.Println("-5 / -2 =", -5 / -2)
    fmt.Println("-5 % -2 =", -5 % -2)
}

¿Qué crees que imprime?

Salida Esperada

-5 / 2  = -2
-5 % 2  = 1  (o al menos, esperar algo consistente o positivo)
5 / -2  = -2
5 % -2  = -1 (o al menos, esperar algo consistente o positivo)
-5 / -2 = 2
-5 % -2 = 1  (o al menos, esperar algo consistente o positivo)

⚠️ Salida Real

-5 / 2  = -2
-5 % 2  = -1
5 / -2  = -2
5 % -2  = 1
-5 / -2 = 2
-5 % -2 = -1

¿Por qué pasa esto?

¡Agarraos los sombreros, matemáticos! 🎩 En Go, cuando hablamos de divisiones y restos con números negativos, las cosas se ponen... interesantes. No es que Go esté borracho, es que tiene sus propias **reglas de etiqueta numérica**. La norma de oro en Go es: - El operador `/` (división) siempre **trunca hacia cero**. Es decir, `-2.5` se convierte en `-2`, no `-3`. - El operador `%` (módulo) siempre devuelve un resto con el **mismo signo que el dividendo**. ¡Sí, el primero de la pareja! 🤯 Así que, cuando ves `-5 % 2`, no esperes un `1`. Como el dividendo (`-5`) es negativo, el resto será negativo: `-1`. Es como un GPS numérico que siempre te lleva al punto más cercano sin pasarse de cero, ¡manteniendo la dirección original! Esto es diferente a cómo otros lenguajes (como Python) manejan el módulo. ¡Cada lenguaje es un mundo!

Conceptos relacionados

arithmeticoperatorsspecification