如何比较两个不同类型的结构?

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
}