Go Academy · Lekcja

Własne analizowanie tagów

Odczytuj tagi za pomocą refleksji

Lekcja 4 z 413 kroki

Własne analizowanie tagów to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 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.

Samodzielne odczytywanie tagów

Można definiować własne klucze tagów i odczytywać je w czasie działania za pomocą pakietu reflect. Pozwala to tworzyć niestandardowe zachowanie sterowane metadanymi.

reflect.TypeOf

reflect.TypeOf zwraca obiekt Type opisujący wartość. Na podstawie typu struktury można sprawdzać jej pola.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
}

func main() {
	t := reflect.TypeOf(User{})
	fmt.Println(t.Kind(), t.NumField())
}

Iterowanie po polach

NumField i Field(i) pozwalają przejść w pętli przez każde pole typu struktury.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
	Age  int
}

func main() {
	t := reflect.TypeOf(User{})
	for i := 0; i < t.NumField(); i++ {
		fmt.Println(t.Field(i).Name)
	}
}

Dostęp do taga pola

Każde pole ma Tag typu reflect.StructTag. Należy wywołać .Get(key), aby odczytać wartość konkretnego taga.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Full Name\""
}

func main() {
	f := reflect.TypeOf(User{}).Field(0)
	fmt.Println(f.Tag.Get("label"))
}

Definiowanie niestandardowego taga

Można utworzyć dowolny klucz taga. W tym przypadku niestandardowy tag label opisuje przyjazną dla użytkownika nazwę każdego pola.

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email Address\""
	City  string "label:\"City\""
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		fmt.Println(f.Name, "->", f.Tag.Get("label"))
	}
}

Tag.Lookup dla opcjonalnych tagów

Tag.Lookup(key) zwraca wartość oraz wartość boolowską. Należy go użyć do obsługi pól, które mogą nie mieć danego taga.

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
	Token string
}

func main() {
	t := reflect.TypeOf(Form{})
	for i := 0; i < t.NumField(); i++ {
		v, ok := t.Field(i).Tag.Lookup("label")
		fmt.Println(t.Field(i).Name, v, ok)
	}
}

Odczytywanie także wartości pól

Połączenie reflect.ValueOf z typem pozwala odczytać zarówno tag, jak i aktualną wartość każdego pola.

package main

import (
	"fmt"
	"reflect"
)

type Form struct {
	Email string "label:\"Email\""
}

func main() {
	f := Form{Email: "a@b.com"}
	t := reflect.TypeOf(f)
	v := reflect.ValueOf(f)
	fmt.Println(t.Field(0).Tag.Get("label"), "=", v.Field(0))
}

Analizowanie opcji tagów

Jeśli wartość taga zawiera kilka opcji (np. name,opt), należy samodzielnie rozdzielić je przecinkiem za pomocą strings.Split.

package main

import (
	"fmt"
	"strings"
)

func main() {
	tag := "name,omitempty"
	parts := strings.Split(tag, ",")
	fmt.Println("name:", parts[0], "opts:", parts[1:])
}

Mały przypadek użycia

Złożenie wszystkiego w całość: utworzenie prostej mapy etykiet na podstawie struktury, której warstwa UI może użyć do wyświetlenia etykiet formularza.

package main

import (
	"fmt"
	"reflect"
)

type Profile struct {
	Name string "label:\"Your Name\""
	Bio  string "label:\"About You\""
}

func main() {
	t := reflect.TypeOf(Profile{})
	labels := map[string]string{}
	for i := 0; i < t.NumField(); i++ {
		f := t.Field(i)
		labels[f.Name] = f.Tag.Get("label")
	}
	fmt.Println(labels)
}

Koszt refleksji

Refleksja jest potężna, ale wolniejsza od bezpośredniego kodu i omija sprawdzanie w czasie kompilacji. Należy używać jej do funkcji w stylu frameworków, a nie w intensywnie wykonywanych pętlach.

Wskaźniki i reflect

W przypadku wskaźnika należy wywołać reflect.TypeOf(v).Elem(), aby uzyskać bazowy typ struktury przed sprawdzeniem pól.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string "label:\"Name\""
}

func main() {
	u := &User{}
	t := reflect.TypeOf(u).Elem()
	fmt.Println(t.Field(0).Tag.Get("label"))
}

Szybkie sprawdzenie

Jaka metoda odczytuje wartość niestandardowego klucza taga z pola struktury uzyskanego za pomocą refleksji?

Podsumowanie

Analizowanie niestandardowych tagów:

  • Należy użyć reflect.TypeOf i iterować po polach
  • field.Tag.Get / Lookup odczytują wartości tagów
  • Wartości należy rozdzielić, aby przeanalizować opcje
  • To rozwiązanie jest potężne, ale wolniejsze; należy używać go do funkcji frameworków
Bezpłatny start

Ucz się Go dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Własne analizowanie tagów” jest bezpłatna?

Tak — pełny tekst „Własne analizowanie tagów” 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 „Własne analizowanie tagów”?

Odczytuj tagi za pomocą refleksji Ć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 4 z 4.

Ile czasu zajmuje lekcja „Własne analizowanie tagów”?

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. Czym są tagi struct
  2. Tagi JSON
  3. Biblioteki walidacji
  4. Własne analizowanie tagów
← Powrót do Go Academy