Обычно плохая идея использовать *T
, когда пользователь дает вам T
.Все изменения на *T
будут НЕ вступать в силу для данных пользователя.
Но если это то, что вы действительно хотите, вы можете использовать отражать.
func testFool(a interface{}) bool {
if _, ok := a.(Fool); ok {
return true
}
t := reflect.PtrTo(reflect.TypeOf(a))
FoolType := reflect.TypeOf((*Fool)(nil)).Elem()
return t.Implements(FoolType)
}
Детская площадка: https://play.golang.org/p/rqJe5_KAP6e
РЕДАКТИРОВАНИЕ: Если вам нужно использовать этот метод с приемником указателя, вы можете использовать reflect.Value
вместо reflect.Type
.Тем не менее, он создает дополнительную копию параметра.
func testFool(a interface{}) bool {
if _, ok := a.(Fool); ok {
return true
}
t := reflect.TypeOf(a)
v := reflect.New(t)
v.Elem().Set(reflect.ValueOf(a))
ptrA := v.Interface()
if foo, ok := ptrA.(Fool); ok {
foo.Foo()
return true
}
return false
}
Можно написать код версии без копирования, используя refelct.NewAt
и · refle.Value.InterfaceData`.Но это крайне не рекомендуется: он, скорее всего, сломает ваш будущий код и его трудно поддерживать;Используется небезопасная упаковка под капотом.