Go Academy · Lektion

Praktisk reflection: Serializers

Opbyg en simpel JSON-lignende serializer med reflect

Lektion 4 af 413 trin

Praktisk reflection: Serializers 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.

Oversigt over brugerdefineret JSON-serialisering

At bygge en brugerdefineret serialisering med refleksion viser praktisk brug af refleksion: gennemløb strukturfelter, læs tags, tilgå værdier, og opbyg output — den samme tilgang, som encoding/json bruger internt.

Enkel struct-til-map

Konvertér en struct til en map[string]any ved hjælp af refleksion:

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
}

Håndtering af pointere

Dereferér pointerfelter, før du læser deres værdier:

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

Håndtering af indlejrede strukturer

Behandl indlejrede strukturfelter rekursivt:

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

Understøttelse af omitempty

Spring felter med nulværdi over, hvis tagget indeholder "omitempty":

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

Map-til-struct (deserialisering)

Udfyld en struct fra en map ved at matche map-nøgler med felttags:

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

Typetilpasning

Værdier fra JSON er ofte float64 for tal. Tilpas dem til måltypen for feltet, når du angiver værdien:

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

Caching af feltmetadata

Gem mappingen fra felter til tags i en sync.Map med reflect.Type som nøgle for at undgå gentagen refleksion ved hvert serialiseringskald.

Alternativ: kodegenerering

På ydeevnekritiske stier kan du generere typespecifikke serialiseringsfunktioner med værktøjer som easyjson eller ffjson. De undgår runtime-refleksion helt.

Hvornår skal du bygge brugerdefinerede serialiseringer?

Brugerdefinerede serialiseringer er nyttige til ikke-JSON-formater som BSON, Avro og CSV, til brugerdefinerede kodningsregler eller ved stramme krav til ydeevnen. Til de fleste anvendelser er encoding/json tilstrækkelig.

Test af serialisatoren

Rundturstest: serialisér en struct til et map, deserialisér den igen, og kontrollér, at værdierne stemmer overens med originalen:

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

Hurtigt tjek

Hvorfor er caching af feltmetadata vigtigt, når du bygger en refleksionsbaseret serialisator?

Opsummering: Refleksionsbaserede serialisatorer

Vigtigste punkter:

  • Gå felterne igennem med NumField/Field, og læs tags med Tag.Get
  • Håndtér pointere, indlejrede structs og nulværdier
  • Cache feltmetadata i sync.Map for bedre ydeevne
  • Brug kodegenerering for det højeste gennemløb
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 “Praktisk reflection: Serializers” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Praktisk reflection: Serializers”, 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 “Praktisk reflection: Serializers”?

Opbyg en simpel JSON-lignende serializer med reflect 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 “Praktisk reflection: Serializers”?

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. reflect.Type og reflect.Value
  2. Undersøgelse af struct-felter og tags
  3. Dynamiske funktionskald
  4. Praktisk reflection: Serializers
← Tilbage til Go Academy