reflect.Type i reflect.Value
TypeOf, ValueOf, Kind i Elem
reflect.Type i reflect.Value to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Przegląd pakietu reflect
Pakiet reflect pozwala programom Go sprawdzać typy i wartości w czasie działania. Stanowi podstawę bibliotek kodowania, ORM-ów i frameworków wstrzykiwania zależności.
reflect.TypeOf
reflect.TypeOf(x) zwraca reflect.Type wartości x:
t := reflect.TypeOf(42)
fmt.Println(t.Name()) // "int"
fmt.Println(t.Kind()) // "int"
fmt.Println(t.String()) // "int"reflect.ValueOf
reflect.ValueOf(x) zwraca reflect.Value zawierającą x. Wartość można odczytać za pomocą metod właściwych dla danego Kind:
v := reflect.ValueOf(42)
fmt.Println(v.Kind()) // "int"
fmt.Println(v.Int()) // 42Type.Kind a Type.Name
Kind to bazowa kategoria języka Go (int, struct, ptr, slice, ...). Name to zadeklarowana nazwa typu ("MyStruct"). Interfejsy mają Kind == Interface, ale nie mają Name.
Pola struktur
Pola struktury można sprawdzać za pomocą Type.NumField() i Type.Field(i), które zwraca reflect.StructField:
t := reflect.TypeOf(User{})
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
fmt.Printf("Field: %s Type: %s Tag: %s\n", f.Name, f.Type, f.Tag.Get("json"))
}Odczytywanie wartości pól struktury
Do odczytywania wartości pól w czasie działania należy użyć Value.FieldByName lub Value.Field(i):
v := reflect.ValueOf(user)
nameField := v.FieldByName("Name")
fmt.Println(nameField.String()) // "Alice"Ustawianie wartości pól struktury
Aby ustawić pole, wartość musi być adresowalna (przekazana jako wskaźnik):
v := reflect.ValueOf(&user).Elem()
v.FieldByName("Name").SetString("Bob")Dereferencjonowanie wskaźników
Jeśli wartość jest wskaźnikiem, należy wywołać v.Elem(), aby uzyskać wskazywaną wartość. Najpierw należy sprawdzić v.Kind() == reflect.Ptr.
if v.Kind() == reflect.Ptr {
v = v.Elem()
}reflect.New
Utworzyć nową wartość zerową typu i uzyskać do niej wskaźnik:
t := reflect.TypeOf(User{})
ptr := reflect.New(t) // *User
user := ptr.Interface().(*User)Wywoływanie metod
Wywołać metodę po nazwie na wartości poddanej refleksji:
v := reflect.ValueOf(user)
m := v.MethodByName("Greet")
results := m.Call(nil)
fmt.Println(results[0].String())Wydajność
Refleksja jest 5-10× wolniejsza od bezpośredniego kodu. Należy buforować wyniki wyszukiwania reflect.Type i reflect.Value poza gorącymi pętlami. Gdy wydajność ma kluczowe znaczenie, należy użyć generowania kodu.
Szybkie sprawdzenie
Jaka jest różnica między reflect.Type.Kind() a reflect.Type.Name()?
Podsumowanie: reflect.Type i reflect.Value
Najważniejsze informacje:
- reflect.TypeOf/ValueOf służą do sprawdzania typów w czasie działania
- Kind: bazowa kategoria; Name: zadeklarowana nazwa
- Value.FieldByName + SetXxx służą do modyfikowania pól struktury
- Przekazywać wskaźnik + wywoływać Elem() dla wartości, które można ustawiać
Często zadawane pytania
Czy lekcja „reflect.Type i reflect.Value” jest bezpłatna?
Tak — pełny tekst „reflect.Type i reflect.Value” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „reflect.Type i reflect.Value”?
TypeOf, ValueOf, Kind i Elem Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „reflect.Type i reflect.Value”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- reflect.Type i reflect.Value
- Inspekcja pól i tagów struktur
- Dynamiczne wywołania funkcji
- Refleksja w praktyce: serializatory