Menu
CoddyTech

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 devuelva 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 predeterminados

type Config struct {
    Host    string
    Port    int
    Timeout int
}

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

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) // Unknown
    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 predeterminados 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 "Unnamed" como valor predeterminado
  • Si balance es negativo, usa 0 como valor predeterminado
  • Establece siempre Owner en "Default Owner"
  • 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