Menu
Coddy logo textTech

Funciones constructoras

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 10 de 107.

Go no tiene constructores como otros lenguajes. En su lugar, la convención es crear una función llamada NewTypeName que devuelve una estructura inicializada, a menudo como un puntero.

Función constructora básica

type Person struct {
    Name string
    Age  int
}

func NewPerson(name string, age int) *Person {
    return &Person{
        Name: name,
        Age:  age,
    }
}

Constructor con valores por defecto

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // Valor por defecto
        Timeout: 30,      // Valor por defecto
    }
}

Constructor con validación

func NewPerson(name string, age int) *Person {
    if name == "" {
        name = "Unknown"
    }
    if age < 0 {
        age = 0
    }
    return &Person{
        Name: name,
        Age:  age,
    }
}

Uso de funciones constructoras

func main() {
    p1 := NewPerson("Alice", 25)
    fmt.Println(p1.Name) // Alice

    p2 := NewPerson("", -5)
    fmt.Println(p2.Name) // Desconocido
    fmt.Println(p2.Age)  // 0
}

Las funciones constructoras devuelven un puntero (*StructName) usando &. Esto evita copiar la estructura y permite que los métodos con receptores de puntero funcionen directamente. La validación y los valores por defecto van dentro del constructor.

challenge icon

Desafío

Intermedio

Crea una función constructora NewBankAccount para la estructura BankAccount con validación:

  • Recibe name (string) y balance (float64) como parámetros
  • Si name está vacío, usa por defecto "Unnamed"
  • Si balance es negativo, usa por defecto 0
  • Establece Owner como "Default Owner" siempre
  • Devuelve un puntero a la nueva estructura

Pruébalo tú mismo

package main

import "fmt"

func main() {
    var name string
    var balance float64
    fmt.Scan(&name, &balance)

    account := NewBankAccount(name, balance)

    fmt.Printf("Account: %s\n", account.Name)
    fmt.Printf("Balance: %.2f\n", account.Balance)
    fmt.Printf("Owner: %s\n", account.Owner)
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online