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

Hoja de referencia

Go utiliza funciones constructoras en lugar de constructores. La convención es nombrarlas NewTypeName y devolver un puntero al struct inicializado.

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:

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,
    }
}

Las funciones constructoras devuelven un puntero (*StructName) usando & para evitar copiar el struct y permitir que los métodos con receptor de puntero funcionen directamente.

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