Go Academy · Lektion

Parsing af brugerdefinerede tags

Læs tags via reflection

Lektion 4 af 413 trin

Parsing af brugerdefinerede tags er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

Læsning af tags selv

Du kan definere dine egne tagnøgler og læse dem under kørsel med reflect-pakken. Det lader dig opbygge brugerdefineret adfærd, der styres af metadata.

reflect.TypeOf

reflect.TypeOf returnerer en Type, der beskriver en værdi. Fra en Type for en struktur kan du inspicere dens felter.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
}

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

Gennemløb af felter

NumField og Field(i) lader dig gennemløbe alle felter i en strukturtype.

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)
	}
}

Adgang til et felts tag

Hvert felt har et Tag af typen reflect.StructTag. Kald .Get(key) for at læse en bestemt tagværdi.

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"))
}

Definition af et brugerdefineret tag

Du kan opfinde en hvilken som helst tagnøgle. Her beskriver et brugerdefineret label-tag et brugervenligt navn for hvert felt.

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 til valgfrie tags

Tag.Lookup(key) returnerer værdien og en boolsk værdi. Brug den til at håndtere felter, der muligvis ikke har dit tag.

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)
	}
}

Læs også feltværdier

Kombinér reflect.ValueOf med typen for at læse både tagget og den aktuelle værdi af hvert felt.

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))
}

Analyse af tagindstillinger

Hvis din tagværdi indeholder indstillinger (som name,opt), skal du selv opdele den med strings.Split ved kommaet.

package main

import (
	"fmt"
	"strings"
)

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

Et lille anvendelseseksempel

Samlet set kan du opbygge et enkelt etiketkort fra en struktur, som et brugergrænsefladelag kan bruge til at vise formularfelter.

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)
}

Refleksionens omkostninger

Refleksion er effektiv, men langsommere end direkte kode og omgår kontroller ved kompilering. Brug den til funktioner i framework-stil, ikke i løkker, der kører ofte.

Pointers og reflect

Hvis du har en pointer, skal du kalde reflect.TypeOf(v).Elem() for at nå den underliggende strukturtype, før du inspicerer felterne.

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"))
}

Hurtigt tjek

Hvilken metode læser værdien af en brugerdefineret tagnøgle fra et strukturfelt, der er hentet via refleksion?

Opsummering

Analyse af brugerdefinerede tags:

  • Brug reflect.TypeOf, og gennemløb felterne
  • field.Tag.Get / Lookup læser tagværdier
  • Opdel værdier for at analysere indstillinger
  • Effektivt, men langsommere; brug det til framework-funktioner
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Parsing af brugerdefinerede tags” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Parsing af brugerdefinerede tags”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Parsing af brugerdefinerede tags”?

Læs tags via reflection Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Parsing af brugerdefinerede tags”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad er struct tags
  2. JSON-tags
  3. Valideringsbiblioteker
  4. Parsing af brugerdefinerede tags
← Tilbage til Go Academy