Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

W 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:

  1. Utwórz funkcję o nazwie processNotification, która przyjmuje parametr typu interface{}
  2. 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)
  3. Wywołaj funkcję processNotification z przekonwertowaną wartością
  4. Wewnątrz funkcji processNotification uż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"

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(&notificationType)
	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
	
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Go online