es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo comparar una estructura completa con r3labs/diff

Me he topado con la biblioteca github.com/r3labs/diff para el lenguaje Go que permite comparar dos estructuras del mismo tipo. La biblioteca funciona bastante bien, excepto en un caso de uso que es el siguiente: estoy utilizando la estructura Date para representar una fecha:


type Date struct {
Year int
Month int
Day int
}

Ahora bien, hay otras estructuras más complejas que utilizan la estructura Date, por ejemplo:


type Student struct {
DateOfBirth Date
}

Si quiero comparar dos estudiantes, por ejemplo:


diff.Diff(
Student{DateOfBirth: Date{2021, 11, 13}},
Student{DateOfBirth: Date{2021, 10, 9}},
)

Lo que obtendría como resultado es un registro de cambios con 2 elementos, uno para el campo DateOfBirth > Month y otro para el campo DateOfBirth > Day.

Lo que quiero es obtener un registro de cambios con un único elemento (DateOfBirth) con el valor 2021-10-09. ¿Es posible hacerlo de alguna forma con la biblioteca?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Go, he investigado la biblioteca github.com/r3labs/diff para comparar dos structs del mismo tipo. Si bien la biblioteca funciona bien para la mayoría de los casos, hay un caso de uso donde falla. Este es cuando usamos la estructura Date para representar una fecha y hay otras estructuras más complejas que utilizan esta estructura Date.

    Si comparamos dos instancias de la estructura Student, que tiene un campo DateOfBirth de tipo Date, obtenemos un registro de cambios con dos elementos para los campos de mes y día de DateOfBirth. Sin embargo, lo que deseamos es un registro de cambios con un único elemento para DateOfBirth que muestre su valor como 2021-10-09.

    Desafortunadamente, parece que la biblioteca github.com/r3labs/diff no está diseñada para manejar este caso de uso en particular. Solo compara los campos individuales de una estructura y no proporciona una forma de personalizar la salida para campos específicos.

    Para lograr el resultado deseado, es posible que deba modificar la biblioteca o escribir su propia función personalizada para comparar structs con tipos Date anidados. Un enfoque podría ser implementar una función Diff personalizada para el tipo Date que devuelva una representación de cadena del valor de la fecha. Luego, puede usar esta función en la función Diff para el tipo Student para obtener la salida deseada.

Comments are closed.