0Pricing
Go Academy · Lección

Reflection práctica: serializadores

Creación de un serializador sencillo similar a JSON con reflect

Reflection práctica: serializadores es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Descripción general de un serializador JSON personalizado

Crear un serializador personalizado con reflexión demuestra un uso práctico de la reflexión: iterar sobre los campos de una estructura, leer tags, acceder a valores y construir la salida; es el mismo enfoque que utiliza internamente encoding/json.

Estructura sencilla a mapa

Convierta una estructura en un map[string]any mediante reflexión:

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
}

Gestión de punteros

Desreferencie los campos de tipo puntero antes de leer sus valores:

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

Gestión de estructuras anidadas

Procese recursivamente los campos de estructuras anidadas:

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

Compatibilidad con omitempty

Omita los campos con valor cero si el tag incluye "omitempty":

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

Mapa a estructura (deserializador)

Rellene una estructura a partir de un mapa haciendo coincidir las claves del mapa con los tags de los campos:

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

Coerción de tipos

Los valores de los mapas procedentes de JSON suelen ser float64 para los números. Conviértalos al tipo del campo de destino al asignarlos:

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

Almacenamiento en caché de metadatos de campos

Almacene en caché la correspondencia entre campos y tags en un sync.Map indexado por reflect.Type para evitar repetir la reflexión en cada llamada de serialización.

Alternativa de generación de código

Para rutas críticas para el rendimiento, genere serializadores específicos para cada tipo con herramientas como easyjson o ffjson. Estas herramientas evitan por completo la reflexión en tiempo de ejecución.

Cuándo crear serializadores personalizados

Los serializadores personalizados son útiles para formatos que no sean JSON (BSON, Avro, CSV), reglas de codificación personalizadas o requisitos estrictos de rendimiento. Para la mayoría de los casos de uso, encoding/json es suficiente.

Probar el serializador

Prueba de ida y vuelta: serialice una estructura en un mapa, vuelva a deserializarla y verifique que los valores coincidan con los originales:

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

Comprobación rápida

¿Por qué es importante almacenar en caché los metadatos de los campos al crear un serializador basado en reflexión?

Repaso: serializadores basados en reflexión

Puntos clave:

  • Itere por los campos con NumField/Field; lea las etiquetas con Tag.Get
  • Gestione punteros, estructuras anidadas y valores cero
  • Almacene en caché los metadatos de los campos en sync.Map para mejorar el rendimiento
  • Utilice generación de código para obtener el máximo rendimiento

Preguntas frecuentes

¿La lección «Reflection práctica: serializadores» es gratis?

Sí — el texto completo de «Reflection práctica: serializadores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Reflection práctica: serializadores»?

Creación de un serializador sencillo similar a JSON con reflect Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Reflection práctica: serializadores»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. reflect.Type y reflect.Value
  2. Inspección de campos y etiquetas de structs
  3. Llamadas dinámicas a funciones
  4. Reflection práctica: serializadores
← Volver a Go Academy