Wartości zerowe i domyślne
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 17 z 107.
W Go każda zmienna ma wartość zerową: domyślną wartość przypisywaną przy deklarowaniu zmiennej bez jawnej inicjalizacji. Zrozumienie wartości zerowych jest niezbędne podczas pracy ze strukturami, ponieważ niezainicjalizowane pola automatycznie otrzymują te wartości domyślne.
Każdy typ ma własną wartość zerową:
| Typ | Wartość zerowa |
|---|---|
| int, float64 | 0 |
| string | "" (pusty ciąg znaków) |
| bool | false |
| pointer, slice, map | nil |
Gdy tworzysz strukturę, każde pole, którego wartości nie ustawisz jawnie, otrzymuje wartość zerową.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (pusty ciąg znaków)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}Dotyczy to również częściowej inicjalizacji. Wartości niestandardowe otrzymują tylko określone przez Ciebie pola.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
Wartości zerowe sprawiają, że struktur można od razu używać bez jawnej inicjalizacji. Zachowaj jednak ostrożność w przypadku typów referencyjnych, takich jak wycinki i mapy. Ich wartością zerową jest nil, co może powodować paniki w czasie działania programu, jeśli spróbujesz ich użyć bez inicjalizacji.
Wyzwanie
ŁatwyZbudujmy system profili graczy, który pokazuje, jak działają wartości zerowe w Go. Utworzysz profil gracza, w którym niektóre pola zostaną jawnie ustawione, a pozostałe będą korzystać z domyślnych wartości zerowych.
Rozmieścisz kod w dwóch plikach:
player.go: Zdefiniuj strukturęPlayerz następującymi polami:Username(string),Level(int),Score(int),IsPremium(bool) iGuildName(string). Utwórz też metodęDisplayProfile, która zwraca sformatowany ciąg znaków zawierający wszystkie informacje o graczu.main.go: Odczytaj nazwę użytkownika z wejścia i utwórz gracza, inicjalizując tylko część pól: ustaw wyłącznie poleUsername. Następnie wyświetl pełny profil, aby zobaczyć, jak Go uzupełnia nieustawione pola ich wartościami zerowymi.
Dane wejściowe będą miały następującą postać:
- Wiersz 1: Nazwa użytkownika gracza
Metoda DisplayProfile powinna zwracać ciąg znaków w dokładnie takim formacie:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]Na przykład, jeśli nazwa użytkownika to ShadowKnight, wynik powinien zawierać nazwę użytkownika oraz wszystkie wartości zerowe dla niezainicjalizowanych pól:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Zwróć uwagę, że pole Guild nie wyświetla niczego po dwukropku: to wartość zerowa będąca pustym ciągiem znaków. To wyzwanie pozwoli ci dokładnie zobaczyć, jaką wartość Go przypisuje każdemu typowi, gdy nie podasz jej jawnie.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Odczytaj nazwę użytkownika z wejścia
var username string
fmt.Scanln(&username)
// TODO: Utwórz Player, używając częściowej inicjalizacji
// Ustaw tylko pole Username, a pozostałe pola pozostaw z wartościami zerowymi
// TODO: Wyświetl profil gracza za pomocą metody DisplayProfile
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online