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 predeterminados

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 no predeterminados van dentro del constructor.

challenge icon

Desafío

Intermedio

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

  • Acepta 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 Owner en "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