Menu
Coddy logo textTech

Funções Construtoras

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 10 de 107.

Go não possui construtores como outras linguagens. Em vez disso, a convenção é criar uma função chamada NewTypeName que retorna uma struct inicializada, frequentemente como um ponteiro.

Função construtora básica

type Person struct {
    Name string
    Age  int
}

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

Construtor com valores padrão

type Config struct {
    Host    string
    Port    int
    Timeout int
}

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

Construtor com validação

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

Usando funções construtoras

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

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

Funções construtoras retornam um ponteiro (*StructName) usando &. Isso evita a cópia da struct e permite que métodos com receptores de ponteiro funcionem diretamente. Validação e valores padrão ficam dentro do construtor.

challenge icon

Desafio

Médio

Crie uma função construtora NewBankAccount para a struct BankAccount com validação:

  • Recebe name (string) e balance (float64) como parâmetros
  • Se name estiver vazio, o padrão deve ser "Unnamed"
  • Se balance for negativo, o padrão deve ser 0
  • Defina Owner como "Default Owner" sempre
  • Retorne um ponteiro para a nova struct

Folha de consulta

Go usa funções construtoras em vez de construtores. A convenção é nomeá-las como NewTypeName e retornar um ponteiro para a struct inicializada.

Função construtora básica:

type Person struct {
    Name string
    Age  int
}

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

Construtor com valores padrão:

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

Construtor com validação:

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

Funções construtoras retornam um ponteiro (*StructName) usando & para evitar a cópia da struct e permitir que métodos com receptor de ponteiro funcionem diretamente.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos