Zero Values & Standardwerte
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 17 von 107.
In Go hat jede Variable einen Nullwert (Zero Value) — den Standardwert, der zugewiesen wird, wenn Sie eine Variable ohne explizite Initialisierung deklarieren. Das Verständnis von Nullwerten ist für die Arbeit mit Structs unerlässlich, da nicht initialisierte Felder automatisch diese Standardwerte erhalten.
Jeder Typ hat seinen eigenen Nullwert:
| Typ | Nullwert |
|---|---|
| int, float64 | 0 |
| string | "" (leerer String) |
| bool | false |
| pointer, slice, map | nil |
Wenn Sie ein Struct erstellen, erhält jedes Feld, das Sie nicht explizit setzen, seinen Nullwert (Zero Value).
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (leerer String)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Dies gilt auch für die teilweise Initialisierung. Nur die von Ihnen angegebenen Felder erhalten benutzerdefinierte Werte.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
Nullwerte machen Structs ohne explizite Initialisierung sofort einsatzbereit. Seien Sie jedoch vorsichtig bei Referenztypen wie Slices und Maps – ihr Nullwert ist nil, was zu Laufzeit-Panics führen kann, wenn Sie versuchen, sie ohne Initialisierung zu verwenden.
Aufgabe
EinfachLassen Sie uns ein Spielerprofil-System erstellen, das demonstriert, wie Nullwerte (Zero Values) in Go funktionieren. Sie werden ein Spielprofil erstellen, bei dem einige Felder explizit gesetzt werden, während andere auf ihren Standard-Nullwerten basieren.
Sie werden Ihren Code auf zwei Dateien verteilen:
player.go: Definieren Sie einPlayer-Struct mit den folgenden Feldern:Username(string),Level(int),Score(int),IsPremium(bool) undGuildName(string). Erstellen Sie außerdem eineDisplayProfile-Methode, die einen formatierten String zurückgibt, der alle Informationen des Spielers anzeigt.main.go: Lesen Sie einen Benutzernamen aus der Eingabe und erstellen Sie einen Player mit teilweiser Initialisierung – setzen Sie nur das FeldUsername. Zeigen Sie dann das vollständige Profil an, um zu sehen, wie Go die nicht gesetzten Felder mit ihren Nullwerten füllt.
Die folgende Eingabe wird bereitgestellt:
- Zeile 1: Der Benutzername des Spielers
Ihre DisplayProfile-Methode sollte einen String in genau diesem Format zurückgeben:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Wenn der Benutzername beispielsweise ShadowKnight lautet, sollte Ihre Ausgabe den Benutzernamen zusammen mit allen Nullwerten für die nicht initialisierten Felder anzeigen:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Beachten Sie, dass das Feld Guild nach dem Doppelpunkt nichts anzeigt – das ist der Nullwert für einen leeren String. Diese Herausforderung hilft Ihnen zu sehen, was Go jedem Typ genau zuweist, wenn Sie keinen expliziten Wert angeben.
Spickzettel
In Go hat jede Variable einen Nullwert (Zero Value) — den Standardwert, der zugewiesen wird, wenn Sie eine Variable ohne explizite Initialisierung deklarieren.
Jeder Typ hat seinen eigenen Nullwert:
| Typ | Nullwert |
|---|---|
| int, float64 | 0 |
| string | "" (leerer String) |
| bool | false |
| pointer, slice, map | nil |
Wenn Sie ein Struct erstellen, erhält jedes Feld, das Sie nicht explizit setzen, seinen Nullwert:
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (leerer String)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Teilweise Initialisierung — nur angegebene Felder erhalten benutzerdefinierte Werte:
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // falseNullwerte machen Structs sofort einsatzbereit, ohne dass eine explizite Initialisierung erforderlich ist. Seien Sie vorsichtig bei Referenztypen wie Slices und Maps — ihr Nullwert ist nil, was zu Laufzeit-Panics führen kann, wenn sie ohne Initialisierung verwendet werden.
Probier es selbst
package main
import (
"fmt"
)
func main() {
// Lies den `username` aus der Eingabe
var username string
fmt.Scanln(&username)
// TODO: Erstelle einen `Player` mittels partieller Initialisierung
// Setze nur das Feld `Username`, lass andere Felder Nullwerte verwenden
// TODO: Zeige das Profil des Spielers mit der Methode `DisplayProfile` an
}
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