Pusty interfejs
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 16 z 68.
Do tej pory pracowałeś z interfejsami, które wymagają określonych metod, ale Go ma specjalny interfejs, który jest niezwykle elastyczny: pusty interfejs, zapisywany jako interface{}.
Pusty interfejs nie ma żadnych wymagań dotyczących metod, co oznacza, że każdy typ w Go automatycznie go spełnia. Ponieważ każdy typ implementuje zero metod (co najmniej), każdy typ można przypisać do zmiennej typu interface{}:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceTo sprawia, że interface{} jest niezwykle przydatny, gdy musisz pracować z danymi o nieznanym lub zmiennym typie. Możesz się z tym spotkać podczas odczytywania plików konfiguracyjnych, obsługi danych wejściowych od użytkownika lub pracy z interfejsami API, które zwracają różne typy danych w zależności od sytuacji.
Jednak ponieważ pusty interfejs może przechowywać dowolny typ, często trzeba ustalić, jaki typ jest w nim faktycznie przechowywany, zanim będzie można sensownie użyć tej wartości. Właśnie dlatego asercje typów i przełączniki typów (których nauczysz się w następnej kolejności) są niezbędnymi narzędziami do bezpiecznej pracy z wartościami interface{}.
Wyzwanie
ŁatwyW tym wyzwaniu poćwiczysz pracę z pustym interfejsem, tworząc procesor danych, który obsługuje różne typy wartości. Utworzysz funkcję, która przyjmuje parametr interface{} i przetwarza różne typy danych.
Otrzymasz dwa wejścia:
- Ciąg znaków reprezentujący typ danych (np.
"int","string","bool"lub"slice") - Ciąg znaków reprezentujący właściwą wartość (np.
"42","hello","true"lub"1,2,3")
Twoim zadaniem jest:
- Utworzyć funkcję o nazwie
processData, która przyjmuje parametrinterface{}i wyświetla informacje o wartości - Na podstawie wejściowego typu danych przekonwertować ciąg znaków z wartością na odpowiedni typ Go:
- Dla
"int": przekonwertować na liczbę całkowitą - Dla
"string": użyć jako ciągu znaków - Dla
"bool": przekonwertować na wartość logiczną - Dla
"slice": przekonwertować wartości rozdzielone przecinkami na tablicę liczb całkowitych
- Dla
- Wywołać funkcję
processDataz przekonwertowaną wartością - W funkcji
processDatawyświetlić wartość i jej typ w formacie:"Value: [value], Type: [type]"
W przypadku wejścia typu slice ciąg znaków z wartościami rozdzielonymi przecinkami, taki jak "1,2,3", należy przekonwertować na []int{1, 2, 3}. Funkcja powinna działać z dowolnym typem, ponieważ przyjmuje interface{}, co pokazuje, że pusty interfejs może przechowywać wartości dowolnego typu. Użyj fmt.Printf wraz ze specyfikatorami formatu %v i %T, aby wyświetlić odpowiednio wartość i typ.
Spróbuj swoich sił
package main
import (
"fmt"
)
func main() {
// Wczytaj dane wejściowe
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: Napisz swój kod poniżej
// 1. Utwórz funkcję processData, która przyjmuje interface{}
// 2. Przekonwertuj valueStr na odpowiedni typ na podstawie dataType
// 3. Wywołaj processData z przekonwertowaną wartością
}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