How can I check if two structs that are not of the same type are equal?
Meaning if we have struct of typeA and struct of typeB, if in both structs we have same amount of fields with the same types - they are equal.
type layoutA struct {
A int
}
type layoutB layoutA
reflect.TypeOf(layoutA{}) == reflect.TypeOf(layoutB{}) // false
cmp.Equal(layoutA{}, layoutB{}) // false
compareStructs(layoutA{}, layoutB{}) // true - need to find this function
cmp package -> "github.com/google/go-cmp/cmp"
If the order of the fields needs to match as well you can just check for "convertability" using the ConvertibleTo
method of the reflect.Type
type.
If the order doesn't matter then you'll have to compare each individual field, a bit more work, but still very basic. First check that both types have the same number of fields, then loop over the fields of one type and check that every field that's present in that type is also present in the other type by using the FieldByName
method and then compare the types of those fields.
You can compare the field types by using reflection with something like this:
func compareStructs(s1 interface{}, s2 interface{}) bool {
type1 := reflect.TypeOf(s1)
type2 := reflect.TypeOf(s2)
numField1 := type1.NumField()
numField2 := type2.NumField()
if numField1 != numField2 {
return false
}
for i := 0; i < numField1; i++ {
field1 := type1.Field(i)
field2 := type2.Field(i)
if field1.Type != field2.Type {
return false
}
}
return true
}