0Pricing
Go Academy · Lekcja

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())     // 42

Type.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

  1. reflect.Type i reflect.Value
  2. Inspekcja pól i tagów struktur
  3. Dynamiczne wywołania funkcji
  4. Refleksja w praktyce: serializatory
← Powrót do Go Academy