Przełącznik typów
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 18 z 68.
Chociaż asercje typu sprawdzają się przy weryfikowaniu pojedynczego typu, często trzeba obsłużyć wiele możliwych typów zmiennej interfejsowej. Właśnie wtedy niezwykle przydatna okazuje się instrukcja switch dla typów — pozwala w przejrzysty sposób wykonywać różne działania w zależności od konkretnego typu.
Przełącznik typów używa tej specjalnej składni: switch v := i.(type). Zwróć uwagę na słowo kluczowe (type) zamiast konkretnego typu. Zmienna v będzie zawierać rzeczywistą wartość o konkretnym typie w każdym przypadku:
func describe(data interface{}) {
switch v := data.(type) {
case int:
fmt.Printf("Integer: %d\n", v)
case string:
fmt.Printf("String: %s\n", v)
case bool:
fmt.Printf("Boolean: %t\n", v)
default:
fmt.Printf("Unknown type: %T\n", v)
}
}W każdym przypadku v automatycznie ma poprawny typ — nie trzeba dodatkowego asercji typu. Dzięki temu przełączniki typów są znacznie czytelniejsze niż łańcuchy wielu asercji typu z instrukcjami if-else, zwłaszcza gdy trzeba obsłużyć kilka różnych typów w jednym miejscu.
Wyzwanie
ŁatwyW tym wyzwaniu przećwiczysz używanie przełączników typów do obsługi wielu typów danych w systemie powiadomień. Utworzysz funkcję, która przetwarza różne typy powiadomień i formatuje je odpowiednio do ich konkretnego typu.
Otrzymasz dwa wejścia:
- Ciąg znaków reprezentujący typ powiadomienia (np.
"email","sms","push"lub"alert") - Ciąg znaków reprezentujący treść lub wartość powiadomienia
Twoje zadanie:
- Utwórz funkcję o nazwie
processNotification, która przyjmuje parametr typuinterface{} - Na podstawie wejściowego typu powiadomienia przekonwertuj treść na odpowiedni typ Go i zapisz ją w zmiennej typu
interface{}:- Dla
"email": użyj treści jako ciągu znaków - Dla
"sms": przekonwertuj treść na liczbę całkowitą (reprezentującą liczbę znaków) - Dla
"push": przekonwertuj treść na wartość logiczną (true dla "enabled", false dla każdej innej wartości) - Dla
"alert": przekonwertuj treść na wartość float64 (reprezentującą poziom priorytetu)
- Dla
- Wywołaj funkcję
processNotificationz przekonwertowaną wartością - Wewnątrz funkcji
processNotificationużyj przełącznika typów, aby obsłużyć każdy typ i wyświetlić odpowiedni komunikat:- Dla
string:"Email notification: [value]" - Dla
int:"SMS notification with [value] characters" - Dla
bool:"Push notifications: [value]" - Dla
float64:"Alert with priority: [value]" - Dla każdego innego typu:
"Unknown notification type"
- Dla
Do konwersji ciągów znaków użyj pakietu strconv. Przy konwersji na wartość logiczną tylko "enabled" powinno dać wynik true. To wyzwanie pokazuje, jak przełączniki typów zapewniają przejrzysty sposób obsługi wielu typów w jednej strukturze sterującej, automatycznie udostępniając poprawnie typowaną wartość w każdym przypadku.
Wyświetlaj wartość float64 w najkrótszej postaci, tak jak robią to fmt.Println lub formaty %v / %g: 3.5 jest wyświetlane jako 3.5, a 1.0 jako 1 (format %f wyświetliłby 1.000000).
Spróbuj swoich sił
package main
import (
"fmt"
"strconv"
)
func main() {
// Wczytaj dane wejściowe
var notificationType string
var content string
fmt.Scanln(¬ificationType)
fmt.Scanln(&content)
// TODO: Napisz swój kod poniżej
// 1. Utwórz funkcję processNotification, która przyjmuje parametr typu interface{}
// 2. Przekonwertuj content na odpowiedni typ na podstawie notificationType
// 3. Wywołaj processNotification z przekonwertowaną wartością
// 4. Użyj instrukcji type switch wewnątrz processNotification, aby obsłużyć różne typy
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online