Cuando somos nuevos en Go y venimos de lenguajes de programación como Typescript, Java o Python estaremos acostumbrados a realizar ciertas cosas usando clases en Go no existen las clases sin embargo podemos usar Structs.
Las Structs son estructuras de datos donde definimos un nuevo tipo que puede contener campos y métodos gracias a otro concepto llamado receiver functions .
Para este blog construiremos una solución en Go que nos permita obtener el comportamiento de una clase en otros lenguajes de programación.
Como ejemplo crearemos una estructura de datos llamada User que contará con distintos campos y métodos.
Será una clase pública en Go ponerle la primera letra en mayúscula a una entidad denota que es pública, esto quiere decir que puede importarte y usarse en cualquier parte del programa.
~type User struct {}
Crearemos dentro de nuestra "clase" usuario los siguientes campos:
~type User struct { Email string Password string Name string ID uint }
En nuestro caso nuestros campos serán todos públicos, si definimos un campo con letra minúscula al inicio no podrá ser accedido de forma externa, será un campo privado.
💡Tip: Ordena siempre tus campos del más pesado al menos pesado.
Go no tiene un constructor explicito para las structs, la forma de inicializar la "clase" sería declarándola.
user := User{}
Nosotros simularemos un constructor para nuestra struct de la siguiente manera.
~type User struct { Email string Password string Name string ID uint } func NewUser(email string, pwd string, name string, id uint) *User{ return &User{ Email: email, Password: pwd, Name: name, ID: id, } }
Ahora para crear una "clase" lo haríamos de la siguiente forma.
~user := NewUser( "test@email.com", "secret123", "Juan Perez", 1, )
Para nuestros métodos usaremos una herramienta de Go llamadas receiver functions que nos permitirá ejecutar funciones invocándolas desde la instancia de nuestra "clase" usuario.
~type User struct { Email string Password string Name string ID uint } func NewUser(email string, pwd string, name string, id uint) *User{ return &User{ Email: email, Password: pwd, Name: name, ID: id, } } /*Por convención no se suele usar this,se usa la primera letra del nombre de la clase "u" en minúscula pero para que se entienda mejor lo dejaremos como this*/ func (this *User) Congrats() { fmt.Printf("Congrats %s", this.Name) }
Ahora ejecutaremos nuestros método.
~user := NewUser( "test@email.com", "secret123", "Juan Perez", 1, ) user.Congrats() // Congrats Juan Perez
Usando este mismo método podemos crear Getters y Setters, yo no soy muy fan pero es posible hacerlo.
En Go lo más similar a la herencia que podemos conseguir es declarar una struct dentro de otra sin asignarle un valor.
~type SuperHero struct { User } superHero := SuperHero{ User{ ... } } superHero.Congrats()
Consejo personal evade la herencia y usa la composición.
Con Go puedes simular el uso de clases usando Structs y es una práctica muy común con esto lograremos realizar muchos de los patrones de diseño que conoces en la programación orientada a objetos.