Menu
Coddy logo textTech

Funkcje konstruktora

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 10 z 107.

Go nie ma konstruktorów takich jak inne języki. Zamiast tego przyjęło się tworzyć funkcję o nazwie NewTypeName, która zwraca zainicjalizowaną strukturę, często jako wskaźnik.

Podstawowa funkcja konstruktora

type Person struct {
    Name string
    Age  int
}

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

Konstruktor z wartościami domyślnymi

type Config struct {
    Host    string
    Port    int
    Timeout int
}

func NewConfig(host string) *Config {
    return &Config{
        Host:    host,
        Port:    8080,    // Wartość domyślna
        Timeout: 30,      // Wartość domyślna
    }
}

Konstruktor z walidacją

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

Korzystanie z funkcji konstruktora

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

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

Funkcje konstruktora zwracają wskaźnik (*StructName) za pomocą &. Pozwala to uniknąć kopiowania struktury i umożliwia bezpośrednie działanie metodom z odbiorcami będącymi wskaźnikami. Walidacja i wartości domyślne znajdują się w konstruktorze.

challenge icon

Wyzwanie

Średni

Utwórz funkcję konstruktora NewBankAccount dla struktury BankAccount z walidacją:

  • Przyjmuje parametry name (string) i balance (float64)
  • Jeśli name jest pusty, ustaw domyślnie "Unnamed"
  • Jeśli balance jest ujemny, ustaw domyślnie 0
  • Zawsze ustaw Owner na "Default Owner"
  • Zwróć wskaźnik do nowej struktury

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online