Go

Go

Tutorial Go: Operadores y expresiones

Go operadores y expresiones: descubre cómo usar operadores aritméticos, lógicos y relacionales en Go, y dominar precedencia y conversiones de tipos.

Aprende Go GRATIS y certifícate

Operadores aritméticos, lógicos y relacionales

En el lenguaje de programación Go, los operadores aritméticos son fundamentales para realizar cálculos matemáticos básicos. Estos operadores incluyen + para la suma, - para la resta, * para la multiplicación, / para la división y % para obtener el resto de una división entera (módulo). Es importante tener en cuenta que la división entre enteros da como resultado un número entero, descartando cualquier parte decimal. Por ejemplo:

a := 10
b := 3
resultado := a / b  // resultado es 3
resto := a % b      // resto es 1

Los operadores lógicos en Go se utilizan para evaluar expresiones booleanas. Los operadores más comunes son && (AND lógico), || (OR lógico) y ! (NOT lógico). Estos operadores permiten construir condiciones complejas combinando varias expresiones booleanas:

x := true
y := false
resultado := x && y  // resultado es false
resultado = x || y   // resultado es true
resultado = !x       // resultado es false

Por otro lado, los operadores relacionales se utilizan para comparar valores. Los operadores ==, !=, <, >, <= y >= permiten determinar la relación entre dos operandos. Estos operadores devuelven un valor booleano (true o false) en función de si la relación es verdadera o falsa:

num1 := 5
num2 := 10
esIgual := num1 == num2   // esIgual es false
esDiferente := num1 != num2 // esDiferente es true
esMayor := num1 > num2    // esMayor es false
esMenorIgual := num1 <= num2 // esMenorIgual es true

Es crucial entender cómo estos operadores se comportan en el contexto de las expresiones. Por ejemplo, combinar operadores lógicos y relacionales puede ser útil en estructuras de control como if o for, permitiendo evaluar condiciones complejas:

if num1 < num2 && num1 != 0 {
    // Código a ejecutar si la condición es verdadera
}

En Go, la evaluación de expresiones sigue un orden de precedencia, donde los operadores aritméticos tienen mayor precedencia que los operadores relacionales, y estos a su vez tienen mayor precedencia que los operadores lógicos. Sin embargo, el uso de paréntesis puede alterar este orden de evaluación para lograr el comportamiento deseado en una expresión:

resultado := (num1 + num2) * (num1 - num2)

En este ejemplo, los paréntesis aseguran que las operaciones de suma y resta se realicen antes de la multiplicación. Los operadores en Go son herramientas esenciales que permiten construir expresiones y condiciones que son el núcleo del flujo lógico en los programas.

Precedencia y asociatividad de operadores

En Go, la precedencia de operadores determina el orden en el que se evalúan los operadores en una expresión sin paréntesis. Los operadores con mayor precedencia se evalúan antes que aquellos con menor precedencia. Por ejemplo, los operadores aritméticos como *, / y % tienen mayor precedencia que + y -. Esto significa que en la expresión a + b * c, la multiplicación se realiza antes que la suma. Para alterar el orden de evaluación, se pueden usar paréntesis: (a + b) * c asegura que la suma se realice antes de la multiplicación.

La asociatividad de operadores define cómo se evalúan los operadores de igual precedencia. La mayoría de los operadores en Go son asociativos a la izquierda, lo que significa que se evalúan de izquierda a derecha. Por ejemplo, en la expresión a - b - c, la operación se evalúa como (a - b) - c. Sin embargo, los operadores de asignación como = son asociativos a la derecha, por lo que a = b = c se evalúa como a = (b = c).

Es fundamental entender cómo la precedencia y la asociatividad afectan la evaluación de expresiones complejas. Considere la expresión a + b * c / d - e. Aquí, b * c se evalúa primero, luego el resultado se divide por d, y finalmente se realizan las operaciones de suma y resta. Para modificar este comportamiento, se pueden usar paréntesis para agrupar operaciones: ((a + b) * c) / (d - e).

A continuación, se muestra un ejemplo práctico que ilustra cómo la precedencia y asociatividad influyen en el resultado de una expresión:

a := 5
b := 10
c := 2
d := 8

resultado := a + b/c*d - a // resultado es 9

En el código anterior, b/c se evalúa primero, luego se multiplica por d, y finalmente se realizan las operaciones de suma y resta. Modificar el orden de evaluación usando paréntesis puede cambiar el resultado significativamente:

resultado := (a + b) / (c * (d - a)) // resultado es 1

La comprensión de la precedencia y asociatividad es crucial para evitar errores lógicos en el código y asegurar que las expresiones se evalúen de acuerdo con las intenciones del desarrollador. Usar paréntesis para aclarar la intención es una práctica recomendada, incluso cuando la precedencia y la asociatividad ya proporcionan el orden correcto.

Conversión y casting de tipos

En Go, la conversión de tipos es un proceso explícito mediante el cual se transforma un valor de un tipo de dato a otro. Esta acción se realiza utilizando una sintaxis específica que difiere de otros lenguajes de programación. En Go, la conversión se lleva a cabo especificando el tipo de destino seguido del valor que se desea convertir, todo ello entre paréntesis. Por ejemplo, si se desea convertir un valor de tipo int a float64, se puede hacer de la siguiente manera:

var entero int = 42
var flotante float64 = float64(entero)

Es importante destacar que la conversión de tipos en Go no es automática, lo que significa que el programador debe especificar explícitamente cuándo y cómo se debe realizar. Esto ayuda a evitar errores de tipo que pueden surgir de conversiones implícitas no deseadas.

El casting en Go es un término que a menudo se utiliza en otros lenguajes para describir la conversión de tipos, pero en Go, el término correcto es conversión, dado que el lenguaje no admite el casting en el sentido tradicional. En Go, la conversión de un tipo a otro debe ser explícita y válida. Por ejemplo, convertir un float64 a int truncará el valor decimal, como se muestra a continuación:

var flotante float64 = 3.14
var entero int = int(flotante) // entero será 3

En este ejemplo, la parte decimal del número flotante se descarta durante la conversión al tipo int, lo que es una característica importante a tener en cuenta al realizar conversiones de tipos.

Go también permite la conversión entre tipos definidos por el usuario, siempre que los tipos subyacentes sean compatibles. Esto se realiza usando la misma sintaxis de conversión, lo que facilita la creación de tipos personalizados que todavía pueden interactuar con los tipos nativos de Go. Por ejemplo:

type MiEntero int
var miValor MiEntero = 10
var valorNormal int = int(miValor)

En este caso, MiEntero es un tipo definido por el usuario basado en int, y su conversión a int es directa y sencilla.

Las conversiones en Go también son aplicables a tipos de datos complejos, como estructuras y slices, siempre que se cumplan ciertas condiciones. Sin embargo, es crucial entender que no todas las conversiones son posibles o tienen sentido, y algunas pueden resultar en errores en tiempo de compilación si los tipos no son compatibles.

Finalmente, la conversión de tipos también juega un papel importante en la interoperabilidad con bibliotecas externas y en la manipulación de datos provenientes de diferentes fuentes, donde los tipos pueden no coincidir exactamente con los esperados en el código. La capacidad de convertir tipos de manera explícita y controlada permite manejar estos casos con precisión y seguridad, asegurando que los valores se interpreten correctamente dentro del programa.

Aprende Go GRATIS online

Todas las lecciones de Go

Accede a todas las lecciones de Go y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Go y certifícate

Certificados de superación de Go

Supera todos los ejercicios de programación del curso de Go y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el uso y funcionamiento de los operadores aritméticos, lógicos y relacionales en Go.
  • Aprender la precedencia y asociatividad de operadores.
  • Realizar conversiones de tipos de manera explícita en Go.
  • Entender las limitaciones y características de la conversión y casting de tipos en Go.
  • Practicar la construcción de expresiones complejas utilizando operadores y paréntesis.