Praktisk reflection: Serializers
Opbyg en simpel JSON-lignende serializer med reflect
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
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
- reflect.Type og reflect.Value
- Undersøgelse af struct-felter og tags
- Dynamiske funktionskald
- Praktisk reflection: Serializers