Учитывая, что вы работаете только с двумя типами, используйте утверждения типа , чтобы получить конкретные типы указателей и сравнить:
func compare(a interface{}, b interface{}) bool {
switch a := a.(type) {
case *string:
b, _ := b.(*string)
return a != nil && b != nil && *a == *b
case *int:
b, _ := b.(*int)
return a != nil && b != nil && *a == *b
default:
return false
}
}
Вот несколько примеров вызова функции:
a := "hello"
b := "world"
c := "hello"
fmt.Println(compare(&a, nil))
fmt.Println(compare(nil, &a))
fmt.Println(compare(&a, &b))
fmt.Println(compare(&a, &a))
fmt.Println(compare(&a, &c))
Запустите его на игровой площадке
Используйте API отражение для сравнения всех сопоставимых типов:
func compare(a interface{}, b interface{}) bool {
if a == nil && b == nil {
return true
}
if a == nil || b == nil {
return false
}
va := reflect.ValueOf(a)
vb := reflect.ValueOf(b)
if va.Type() != vb.Type() {
return false
}
if va.Kind() == reflect.Ptr {
if va.IsNil() || vb.IsNil() {
return false
}
va = va.Elem()
vb = vb.Elem()
}
if !va.Type().Comparable() {
return false
}
return va.Interface() == vb.Interface()
}