Struktury anonimowe
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 15 z 107.
Struktura anonimowa to struktura bez nazwanego typu. Definiujesz jej strukturę i tworzysz jej instancję w jednym kroku, bez użycia słowa kluczowego type.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Tworzy to wartość struktury bezpośrednio, bez deklarowania typu wielokrotnego użytku. Struktury anonimowe są przydatne, gdy potrzebujesz szybkiej, jednorazowej struktury danych, która nie będzie używana nigdzie indziej w Twoim kodzie.
Typowym zastosowaniem jest grupowanie powiązanych danych na potrzeby pojedynczej funkcji lub testu.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostStruktury anonimowe są również popularne w testach opartych na tabelach, w których każdy przypadek testowy ma unikalne pola.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Ponieważ anonimowe struktury nie mają nazwy typu, nie możesz definiować dla nich metod ani ponownie używać tego typu w innym miejscu. Używaj ich do tymczasowego grupowania danych w ograniczonym zakresie. Jeśli zamierzasz odwoływać się do czegoś wielokrotnie, zdefiniuj zamiast tego nazwany typ struktury.
Wyzwanie
ŁatwyZbudujmy prosty system konfiguracji, który pokazuje, kiedy przydają się struktury anonimowe — do jednorazowego grupowania danych, które nie wymaga wielokrotnego użycia typu.
Podzielisz kod na dwa pliki:
config.go: Utwórz funkcję o nazwieGetServerConfig, która przyjmuje jako parametry nazwę serwera (string), port (int) oraz tryb debugowania (bool). Ta funkcja powinna zwracać strukturę anonimową zawierającą te trzy wartości w polach:Name,PortiDebug. Ponieważ ta konfiguracja jest używana tylko w jednym miejscu, nie ma potrzeby definiowania dla niej nazwanego typu.main.go: Odczytaj wartości konfiguracji serwera z wejścia, wywołaj funkcjęGetServerConfigi wyświetl szczegóły konfiguracji.
Dane wejściowe będą następujące:
- Wiersz 1: Nazwa serwera
- Wiersz 2: Numer portu
- Wiersz 3: Tryb debugowania (
truelubfalse)
Format wyjściowy:
Server: [Name]
Port: [Port]
Debug: [Debug]Na przykład dla wartości api-server, 8080 i true wynik powinien wyglądać tak:
Server: api-server
Port: 8080
Debug: trueZwróć uwagę, że struktura anonimowa pozwala zwracać pogrupowane dane bez zaśmiecania bazy kodu typem używanym tylko raz.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Wczytaj wartości wejściowe
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: Wywołaj GetServerConfig z wartościami wejściowymi
// i zapisz zwróconą strukturę anonimową
// TODO: Wypisz konfigurację w wymaganym formacie:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
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