Konstruktor-Funktionen
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 10 von 107.
Go hat keine Konstruktoren wie andere Sprachen. Stattdessen ist es üblich, eine Funktion namens NewTypeName zu erstellen, die ein initialisiertes Struct zurückgibt, oft als Pointer.
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
MittelErstellen Sie eine Konstruktor-Funktion NewBankAccount für das BankAccount-Struct mit Validierung:
- Nimmt
name(string) undbalance(float64) als Parameter entgegen - Wenn
nameleer ist, setzen Sie den Standardwert auf"Unnamed" - Wenn
balancenegativ ist, setzen Sie den Standardwert auf0 - Setzen Sie
Ownerimmer auf"Default Owner" - Geben Sie einen Pointer auf das neue Struct zurück
Spickzettel
Go verwendet Konstruktorfunktionen anstelle von Konstruktoren. Die Konvention ist, sie NewTypeName zu nennen und einen Pointer auf das initialisierte Struct zurückzugeben.
Einfache Konstruktorfunktion:
type Person struct {
Name string
Age int
}
func NewPerson(name string, age int) *Person {
return &Person{
Name: name,
Age: age,
}
}Konstruktor mit Standardwerten:
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,
}
}Konstruktorfunktionen geben einen Pointer (*StructName) unter Verwendung von & zurück, um das Kopieren des Structs zu vermeiden und es Pointer-Receiver-Methoden zu ermöglichen, direkt zu arbeiten.
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 Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool