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?
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 estructuraDate
para representar una fecha y hay otras estructuras más complejas que utilizan esta estructuraDate
.Si comparamos dos instancias de la estructura
Student
, que tiene un campoDateOfBirth
de tipoDate
, obtenemos un registro de cambios con dos elementos para los campos de mes y día deDateOfBirth
. Sin embargo, lo que deseamos es un registro de cambios con un único elemento paraDateOfBirth
que muestre su valor como2021-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ónDiff
personalizada para el tipoDate
que devuelva una representación de cadena del valor de la fecha. Luego, puede usar esta función en la funciónDiff
para el tipoStudent
para obtener la salida deseada.