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:
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.
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