Konstruktorfunktionen
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 10 von 107.
Go hat keine Konstruktoren wie andere Sprachen. Stattdessen besteht die Konvention darin, eine Funktion namens NewTypeName zu erstellen, die eine initialisierte Struktur zurückgibt, häufig als Zeiger.
Grundlegende Konstruktor-Funktion
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}Konstruktor mit Standardwerten
type Config struct {
Host string
Port int
Timeout int
}
func NewConfig(host string) *Config {
return &Config{
Host: host,
Port: 8080, // Standardwert
Timeout: 30, // Standardwert
}
}Konstruktor mit Validierung
func NewPerson(name string, age int) *Person {
if name == "" {
name = "Unknown"
}
if age < 0 {
age = 0
}
return &Person{
Name: name,
Age: age,
}
}Verwendung von Konstruktorfunktionen
func main() {
p1 := NewPerson("Alice", 25)
fmt.Println(p1.Name) // Alice
p2 := NewPerson("", -5)
fmt.Println(p2.Name) // Unbekannt
fmt.Println(p2.Age) // 0
}Konstruktorfunktionen geben unter Verwendung von & einen Pointer (*StructName) zurück. Dies vermeidet das Kopieren des Structs und ermöglicht es Methoden mit Pointer-Receivern, direkt zu arbeiten. Validierung und Standardwerte gehören in den Konstruktor.
Aufgabe
MittelErstelle eine Konstruktorfunktion NewBankAccount für die Struktur BankAccount mit Validierung:
- Akzeptiert
name(string) undbalance(float64) als Parameter - Wenn
nameleer ist, standardmäßig"Unnamed"verwenden - Wenn
balancenegativ ist, standardmäßig0verwenden Ownerimmer auf"Default Owner"setzen- Einen Zeiger auf die neue Struktur zurückgeben
Probier es selbst
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)
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler