Menu
Coddy logo textTech

Funzioni costruttrici

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 10 di 107.

Go non ha costruttori come altri linguaggi. Invece, la convenzione consiste nel creare una funzione chiamata NewTypeName che restituisce una struct inizializzata, spesso come puntatore.

Funzione di costruttore di base

type Person struct {
    Name string
    Age  int
}

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

Costruttore con valori predefiniti

type Config struct {
    Host    string
    Port    int
    Timeout int
}

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

Costruttore con convalida

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

Uso delle funzioni costruttrici

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

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

Le funzioni costruttrici restituiscono un puntatore (*StructName) usando &. Questo evita di copiare la struct e permette ai metodi con receiver puntatore di funzionare direttamente. La validazione e i valori predefiniti vanno inseriti nel costruttore.

challenge icon

Sfida

Medio

Crea una funzione costruttore NewBankAccount per la struct BankAccount con convalida:

  • Accetta name (string) e balance (float64) come parametri
  • Se name è vuoto, imposta il valore predefinito "Unnamed"
  • Se balance è negativo, imposta il valore predefinito 0
  • Imposta sempre Owner su "Default Owner"
  • Restituisci un puntatore alla nuova struct

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online