0Pricing
Go Academy · Lezione

Reflection pratica: serializzatori

Creare un semplice serializzatore simile a JSON con reflect

Reflection pratica: serializzatori è 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.

Panoramica di un serializzatore JSON personalizzato

La creazione di un serializzatore personalizzato con la reflection dimostra un uso pratico della reflection: iterare sui campi delle struct, leggere i tag, accedere ai valori e costruire l'output, seguendo lo stesso approccio utilizzato internamente da encoding/json.

Conversione semplice da struct a map

Converta una struct in una map[string]any utilizzando la reflection:

func StructToMap(v any) map[string]any {
    t := reflect.TypeOf(v)
    val := reflect.ValueOf(v)
    result := make(map[string]any, t.NumField())
    for i := 0; i < t.NumField(); i++ {
        f := t.Field(i)
        if !f.IsExported() { continue }
        key := f.Tag.Get("json")
        if key == "" { key = f.Name }
        result[key] = val.Field(i).Interface()
    }
    return result
}

Gestione dei puntatori

Dereferenzi i campi puntatore prima di leggerne i valori:

fv := val.Field(i)
if fv.Kind() == reflect.Ptr {
    if fv.IsNil() { continue }
    fv = fv.Elem()
}

Gestione delle struct annidate

Elabori ricorsivamente i campi delle struct annidate:

if fv.Kind() == reflect.Struct {
    result[key] = StructToMap(fv.Interface())
    continue
}

Supporto per omitempty

Ignori i campi con valore zero se il tag include "omitempty":

if strings.Contains(tag, "omitempty") && fv.IsZero() { continue }

Da map a struct (deserializzatore)

Valorizzi una struct a partire da una map associando le chiavi della map ai tag dei campi:

func MapToStruct(m map[string]any, dest any) {
    t := reflect.TypeOf(dest).Elem()
    v := reflect.ValueOf(dest).Elem()
    for i := 0; i < t.NumField(); i++ {
        key := t.Field(i).Tag.Get("json")
        if val, ok := m[key]; ok {
            v.Field(i).Set(reflect.ValueOf(val))
        }
    }
}

Conversione dei tipi

I valori delle map provenienti da JSON sono spesso float64 per i numeri. Li converta nel tipo del campo di destinazione durante l'impostazione:

if f.Type.Kind() == reflect.Int && reflect.TypeOf(val).Kind() == reflect.Float64 {
    v.Field(i).SetInt(int64(val.(float64)))
}

Memorizzazione nella cache dei metadati dei campi

Memorizzi nella cache la corrispondenza tra campi e tag in una sync.Map indicizzata per reflect.Type, per evitare di ripetere la reflection a ogni chiamata di serializzazione.

Alternativa: generazione del codice

Per i percorsi in cui le prestazioni sono fondamentali, generi serializzatori specifici per tipo con strumenti come easyjson o ffjson. Questi evitano completamente la reflection a runtime.

Quando creare serializzatori personalizzati

I serializzatori personalizzati sono utili per: formati non JSON (BSON, Avro, CSV), regole di codifica personalizzate o requisiti stringenti di prestazioni. Per la maggior parte dei casi d'uso, encoding/json è sufficiente.

Test del serializer

Test round-trip: serializzare una struct in una mappa, deserializzarla nuovamente e verificare che i valori corrispondano a quelli originali:

u := User{Name: "Alice", Age: 30}
m := StructToMap(u)
var u2 User
MapToStruct(m, &u2)
assert.Equal(t, u, u2)

Verifica rapida

Perché la memorizzazione nella cache dei metadati dei campi è importante nella costruzione di un serializer basato sulla reflection?

Riepilogo: serializer basati sulla reflection

Punti chiave:

  • Scorrere i campi con NumField/Field; leggere i tag con Tag.Get
  • Gestire puntatori, struct annidate e valori zero
  • Memorizzare nella cache i metadati dei campi in sync.Map per ottenere prestazioni migliori
  • Utilizzare la generazione di codice per ottenere il throughput più elevato

Domande Frequenti

La lezione «Reflection pratica: serializzatori» è gratuita?

Sì — il testo completo di «Reflection pratica: serializzatori» è 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 «Reflection pratica: serializzatori»?

Creare un semplice serializzatore simile a JSON con reflect 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 «Reflection pratica: serializzatori»?

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. reflect.Type e reflect.Value
  2. Ispezionare i campi e i tag delle struct
  3. Chiamate dinamiche di funzioni
  4. Reflection pratica: serializzatori
← Torna a Go Academy