"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo descomponer JSON de forma segura con tipos genéricos en Go 1.18?

¿Cómo puedo descomponer JSON de forma segura con tipos genéricos en Go 1.18?

Publicado el 2024-11-07
Navegar:451

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Uso genérico en Unmarshal (Go 1.18)

Al utilizar genéricos en Go 1.18, como crear un contenedor para contener varios tipos de informes, Pueden surgir restricciones de tipo. Considere la siguiente configuración:

  • Múltiples tipos de informes representados por estructuras
  • Un contenedor ReportContainer con un parámetro de tipo genérico Reportable, restringido para implementar la interfaz Reportable
  • Un discriminador ReportType para determinar el tipo de informe concreto durante la desclasificación

Es posible que encuentre desafíos con restricciones de tipo en los tipos de devolución, lo que lleva a una "semántica de texto libre" en la función GetBody() para acomodar la aserción de tipo.

Desafíos y soluciones

El problema se debe a que Go no admite afirmaciones de tipos para estructuras y no permite punteros a tipos genéricos. Para solucionar esto, puede crear una interfaz que implemente captadores para LocationID, Provider, ReportType y Body. Sin embargo, esta solución requiere sacrificar la seguridad de tipos.

Un enfoque más seguro implica renunciar al polimorfismo paramétrico y utilizar una declaración de cambio concreta basada en el valor del discriminador durante la desclasificación de JSON. Esto garantiza que se utilice el tipo concreto correcto para cada tipo de informe.

Enfoque alternativo

Para el análisis JSON dinámico, puede emplear una función genérica de desclasificación:

func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}

Si bien esta función ofrece flexibilidad, es esencial tener en cuenta que si su implementación es mínima, simplemente realiza las mismas acciones que incluir la lógica de desarmado directamente. Por lo tanto, el uso de esta función solo se justifica si introduce lógica adicional.

En resumen, considere cuidadosamente la necesidad de genéricos cuando trabaje con tipos concretos y desclasificación JSON. Opte por una solución basada en conmutadores cuando sea necesario sin comprometer la seguridad de tipos y tenga cuidado al emplear funciones genéricas que dupliquen innecesariamente la funcionalidad.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3