Nullwerte & Standardwerte
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 17 von 107.
In Go hat jede Variable einen Nullwert: den Standardwert, der zugewiesen wird, wenn du eine Variable ohne explizite Initialisierung deklarierst. Das Verständnis von Nullwerten ist für die Arbeit mit Strukturen unerlässlich, da nicht initialisierte Felder automatisch diese Standardwerte erhalten.
Jeder Typ hat seinen eigenen Nullwert:
| Typ | Nullwert |
|---|---|
| int, float64 | 0 |
| string | "" (leere Zeichenkette) |
| bool | false |
| pointer, slice, map | nil |
Wenn du eine Struktur erstellst, erhält jedes Feld, das du nicht ausdrücklich festlegst, 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
}Dies gilt auch für die teilweise Initialisierung. Nur die Felder, die du angibst, erhalten benutzerdefinierte Werte.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
Nullwerte machen Strukturen sofort ohne explizite Initialisierung nutzbar. Sei jedoch vorsichtig mit Referenztypen wie Slices und Maps. Ihr Nullwert ist nil, was zu Laufzeit-Panics führen kann, wenn du versuchst, sie ohne Initialisierung zu verwenden.
Aufgabe
EinfachLass uns ein Spielersystem erstellen, das zeigt, wie Nullwerte in Go funktionieren. Du wirst ein Spielprofil erstellen, bei dem einige Felder ausdrücklich gesetzt werden, während andere auf ihren standardmäßigen Nullwerten beruhen.
Du wirst deinen Code auf zwei Dateien verteilen:
player.go: Definiere einePlayer-Struktur mit den folgenden Feldern:Username(string),Level(int),Score(int),IsPremium(bool) undGuildName(string). Erstelle außerdem eineDisplayProfile-Methode, die eine formatierte Zeichenkette zurückgibt, in der alle Informationen des Spielers angezeigt werden.main.go: Lies einen Benutzernamen aus der Eingabe ein und erstelle einen Player mit nur teilweiser Initialisierung: Setze lediglich das FeldUsername. Zeige anschließend 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
Deine DisplayProfile-Methode sollte eine Zeichenkette in genau diesem Format zurückgeben:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Wenn der Benutzername beispielsweise ShadowKnight lautet, sollte deine Ausgabe den Benutzernamen zusammen mit allen Nullwerten für die nicht initialisierten Felder anzeigen:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Beachte, dass das Feld Guild nach dem Doppelpunkt nichts anzeigt: Das ist der Nullwert der leeren Zeichenkette. Diese Aufgabe hilft dir, genau zu erkennen, welchen Wert Go jedem Typ zuweist, wenn du keinen ausdrücklichen Wert angibst.
Probier es selbst
package main
import (
"fmt"
)
func main() {
// Benutzernamen von der Eingabe lesen
var username string
fmt.Scanln(&username)
// TODO: Erstelle einen Player mit partieller Initialisierung
// Setze nur das Username-Feld, lass die anderen Felder Nullwerte verwenden
// TODO: Zeige das Profil des Spielers mit der DisplayProfile-Methode 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 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