0Pricing
Go Academy · Lezione

Parsing personalizzato dei tag

Leggere i tag tramite reflection

Parsing personalizzato dei tag è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Lettura autonoma dei tag

È possibile definire chiavi di tag personalizzate e leggerle durante l'esecuzione con il pacchetto reflect. Questo consente di creare comportamenti personalizzati guidati dai metadati.

reflect.TypeOf

reflect.TypeOf restituisce un Type che descrive un valore. Da un Type di una struct è possibile esaminarne i campi.

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Name string
}

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

Iterazione dei campi

NumField e Field(i) consentono di scorrere tutti i campi di un tipo struct.

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

Accesso al tag di un campo

Ogni campo ha un Tag di tipo reflect.StructTag. Chiamare .Get(key) permette di leggere il valore di un tag specifico.

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

Definizione di un tag personalizzato

È possibile inventare qualsiasi chiave di tag. In questo caso, un tag personalizzato label descrive un nome intuitivo per ogni campo.

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 per i tag opzionali

Tag.Lookup(key) restituisce il valore e un bool. Lo si può usare per gestire i campi che potrebbero non avere il tag desiderato.

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

Lettura anche dei valori dei campi

Combinare reflect.ValueOf con il tipo consente di leggere sia il tag sia il valore corrente di ogni campo.

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

Analisi delle opzioni dei tag

Se il valore del tag contiene più opzioni, ad esempio name,opt, è necessario suddividerlo manualmente con strings.Split sulla virgola.

package main

import (
	"fmt"
	"strings"
)

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

Un piccolo caso d'uso

Mettiamo insieme i concetti: costruiamo una semplice mappa di etichette a partire da una struct, che un livello dell'interfaccia utente potrebbe usare per visualizzare le etichette dei campi di un modulo.

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

Costi della reflection

La reflection è potente, ma più lenta del codice diretto e aggira i controlli in fase di compilazione. La si usi per funzionalità tipiche dei framework, non nei cicli eseguiti frequentemente.

Puntatori e reflect

Se si dispone di un puntatore, chiamare reflect.TypeOf(v).Elem() consente di raggiungere il tipo struct sottostante prima di esaminarne i campi.

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

Verifica rapida

Quale metodo legge il valore di una chiave di tag personalizzata dal campo di una struct ottenuto tramite reflection?

Riepilogo

Analisi dei tag personalizzati:

  • Usare reflect.TypeOf e scorrere i campi
  • field.Tag.Get / Lookup leggono i valori dei tag
  • Suddividere i valori per analizzare le opzioni
  • È potente ma più lento; usarlo per le funzionalità dei framework

Domande Frequenti

La lezione «Parsing personalizzato dei tag» è gratuita?

Sì — il testo completo di «Parsing personalizzato dei tag» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Parsing personalizzato dei tag»?

Leggere i tag tramite reflection Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Parsing personalizzato dei tag»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Cosa sono gli struct tag
  2. Tag JSON
  3. Librerie di validazione
  4. Parsing personalizzato dei tag
← Torna a Go Academy