Go y Golang

Ejemplos e introducción a los objetos y clases en Go

Introducción

Go, o Golang es un lenguaje de programación compilado. No tiene una forma de definir una clase (así como estamos acostumbrados por ejemplo en Java) pero sí podemos crear objetos.

¿Cómo declarar una clase en Go?

No declaramos una clase, declaramos un tipo. Por ejemplo, si yo quisiera declarar la clase Mascota, pondría esto:

type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

Declaramos variables de distintos tipos dentro de nuestro tipo.

¿Cómo crear un objeto en Go?

Tomando el ejemplo de arriba, podemos crear un objeto de la siguiente forma:

package main


import "fmt"


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

func main() {
 mascota := Mascota{1, "Maggie", "No sé", true}
 fmt.Println(mascota)
}

Podemos imprimirlo, se verá esto:

Instanciar un objeto

Podemos instanciar o crear un objeto de 2 maneras. En la primera, mandamos en orden los valores del objeto. Así:

mascota := Mascota{1, "Maggie", "No sé", true}

Pero no recomiendo esa forma, ya que no es expresiva y si el orden de los valores cambia dentro del tipo, tendremos que cambiar también las llamadas a la creación del mismo.

Recomiendo esto:

mascota := Mascota{
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }

Ahí definimos cuál variable estamos pasando. Además, el orden no importa (en este caso las mandé en el mismo orden pero fue coincidencia)

Métodos dentro de una clase

También podemos declarar métodos o funciones. Programemos la función ladrar, en donde imprimimos un mensaje y accedemos a algunas propiedades de nuestra mascota.

package main


import "fmt"


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

func (m *Mascota) ladrar() {
 fmt.Printf("¡guau! me llamo %s y tengo %d años", m.nombre, m.edad)
}

func main() {
 mascota := Mascota{
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }
 mascota.ladrar()
}

Vemos claramente que no definimos la función dentro de nuestro tipo, sino que la adjuntamos a un apuntador del mismo. Si yo ejecuto el programa, sale esto:

Métodos de clases en Go

 

Modificando y obteniendo propiedades

Podemos modificarlas directamente, como se ve a continuación:

package main


import "fmt"


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

func (m *Mascota) ladrar() {
 fmt.Printf("¡guau! me llamo %s y tengo %d años\n", m.nombre, m.edad)
}

func main() {
 mascota := Mascota{
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }
 mascota.ladrar()
 /*
  Modificar su edad y luego ladrar de nuevo
 */ mascota.edad = 2
 mascota.ladrar()
}
Modificar variable en objeto

Igualmente obtenerlas:

package main


import "fmt"


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

func (m *Mascota) ladrar() {
 fmt.Printf("¡guau! me llamo %s y tengo %d años\n", m.nombre, m.edad)
}

func main() {
 mascota := Mascota{
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }
 mascota.ladrar()
 /*
  Obtener su nombre y guardarlo en una variable
 */ nombre := mascota.nombre
 fmt.Println("La mascota se llama ", nombre)
}

Con este resultado:

Obtener propiedad de un objeto

Pero no es recomendado obtenerlas así. Eso sería dejar nuestras variables públicas, y generaría  (en la mayoría de los casos) muchos errores.

Setters y getters

Podemos crear getters y setters para obtener y establecer propiedades. Veamos por ejemplo el setter y getter de edad.

Para establecer su edad definimos otra función, igualmente para obtenerla.

package main


import "fmt"


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
}

func (m *Mascota) ladrar() {
 fmt.Printf("¡guau! me llamo %s y tengo %d años\n", m.nombre, m.edad)
}

func (m *Mascota) Edad() int{
 return m.edad
}

func (m *Mascota) SetEdad(nuevaEdad int) {
 m.edad = nuevaEdad
}

func main() {
 mascota := Mascota{
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }
 mascota.ladrar()

 //modificar edad
 mascota.SetEdad(2)

 mascota.ladrar()
}

El resultado al ejecutarlo sigue siendo el mismo, pero ahora ya hemos implementado getters y setters.

Setter en Go

Objetos dentro de otras clases

Para terminar el post y no hacerlo muy largo, veamos que podemos tener objetos dentro de objetos.

Pongamos a nuestra mascota un dueño. Un dueño es del tipo Persona.

package main


import "fmt"



type Persona struct{
 edad int
 nombre, genero string
}


type Mascota struct{
 edad int
 nombre, raza string
 sana bool
 dueño Persona
}
/*
 Nuevo método
*/func (m *Mascota) saludar() {
 fmt.Printf("¡Hola %s! Bienvenido a casa\n", m.dueño.nombre)
}

func (m *Mascota) ladrar() {
 fmt.Printf("¡guau! me llamo %s y tengo %d años\n", m.nombre, m.edad)
}

func (m *Mascota) Edad() int{
 return m.edad
}

func (m *Mascota) SetEdad(nuevaEdad int) {
 m.edad = nuevaEdad
}


func main() {
 mascota := Mascota{
  dueño: Persona{
   nombre: "Luis",
   genero: "M",
   edad: 50,
  },
  edad: 10,
  nombre: "Guayaba",
  raza: "Tampoco la conozco",
  sana: true,
 }
 mascota.saludar()
 mascota.ladrar()
}

Al ejecutar, el resultado es este:

Objetos dentro de objetos en Go

Con eso terminamos por hoy.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.