Implementación de Constructores en Go: Ejemplos y Mejores Prácticas
Clase 8 de 30 • Curso de Go Intermedio: Programación Orientada a Objetos y Concurrencia
Resumen
¿Qué son los constructores y por qué son importantes?
Los constructores son una herramienta fundamental en la programación orientada a objetos, pues permiten instanciar clases y convertirlas en objetos. Sirven para preconfigurar o precargar ciertas propiedades esenciales para el funcionamiento y personalización de esos objetos. Ya sea en TypeScript, Python o Go, los constructores cumplen con el mismo propósito esencial: dotar de valores iniciales a las propiedades de un objeto al momento de su creación.
¿Cómo se implementan los constructores en diferentes lenguajes de programación?
En TypeScript
En TypeScript, los constructores son parte integral de las clases. Permiten definir y asignar valores a propiedades específicas al momento de crear un objeto. Por ejemplo, al implementar un constructor que reciba parámetros como name
e id
, estos serán asignados y utilizados cuando se instancie un nuevo objeto de la clase:
class Employee {
constructor(public name: string, public id: number) {}
}
const employee = new Employee('John', 1);
En Python
Python es igual de intuitivo en cuanto a constructores, utilizando el método especial __init__
para inicializar objetos con las propiedades deseadas:
class Employee:
def __init__(self, name, id):
self.name = name
self.id = id
employee = Employee('John', 1)
En Go
En Go, los constructores no existen tal cual en el lenguaje, pero se pueden emular a través de funciones personalizadas. Tal es el caso con el uso de structs
, donde se puede definir una estructura y una función para crear instancias con valores iniciales:
type Employee struct {
ID int
Name string
Vacation bool
}
func NewEmployee(id int, name string, vacation bool) *Employee {
return &Employee{
ID: id,
Name: name,
Vacation: vacation,
}
}
func main() {
e1 := NewEmployee(1, "Alice", true)
fmt.Println(e1)
}
¿Cómo agregar propiedades con valores predeterminados en Go?
En Go, si no se especifican valores al inicializar un struct
, el lenguaje automáticamente asigna valores por defecto: 0
para enteros, ""
para strings y false
para booleanos. Esto es importante de considerar para evitar errores al suponer que las propiedades son nil
sin inicialización explícita.
// Ejemplo: struct con valores predeterminados
employee := Employee{}
fmt.Println(employee) // Output: Employee{ID:0 Name:"" Vacation:false}
¿Cuáles son las diferentes maneras para crear objetos en Go?
Fórmula número uno: Inicialización directa
Podemos inicializar un objeto directamente sin especificar valores para las propiedades, lo cual hará que se asignen valores predeterminados.
Fórmula número dos: Inicialización explícita
Definiendo explícitamente las propiedades desde su creación, se asignarán los valores especificados:
employee := Employee{
ID: 1,
Name: "Bob",
Vacation: true,
}
Fórmula número tres: Uso del operador new
El operador new
es una alternativa válida, pero devuelve un apuntador en vez de una copia del objeto:
employee := new(Employee)
Fórmula número cuatro: Uso de una función constructora
Crear una función constructora personalizada te ofrecerá flexibilidad y un control detallado sobre el proceso de inicialización, permitiendo ajustar el comportamiento del objeto según se necesite antes de su creación definitiva.
func NewEmployee(id int, name string, vacation bool) *Employee {
return &Employee{
ID: id,
Name: name,
Vacation: vacation,
}
}
¿Por qué optar por funciones constructoras en Go?
La utilización de funciones constructoras es especialmente valiosa en Go ya que, además de poder definir valores iniciales, te da la posibilidad de ejecutar lógica adicional previa a retornar el objeto. Esto incluye la inicialización de servicios, carga de dependencias o cualquier configuración necesaria. Aconsejamos el uso de funciones constructoras para maximizar la personalización y eficiencia del proceso de creación de objetos en Go, emulando el comportamiento de los constructores en otros lenguajes de programación orientada a objetos.