So, I was trying to find the solution via the search and web-search. Wasn't successful. This has likely a simple solution, but probably I'm just a bit messed up.
I have prepared the following example in go playground.
// main.go
type myInterface interface {
Function1() string
Function2() int
}
type notMyStruct struct {
myInterface
// arbitrary implementation
}
func myFunc(val myInterface) {
fmt.Printf("%T %v", val, val)
fmt.Printf("this failes: %q", val.Function1())
// how to safely test,
// whether the underlying value
// has implemented the interface?
}
func main() {
myFunc(¬MyStruct{})
}
It consists of an interface myInterface
, an arbitrary struct notMyStruct
, which has the embedded interface (but not actually implemented) and some other arbitrary fields.
Now this struct is injected into myFunc
, which the go compiler will accept, due to the fact that the interface is embedded.
But if myFunc
tries to call a Function of the interface, it panics – understandably.
Assuming, I don't know the actual struct implementation (because I'm not in control of the interface-implementing code):
How can I reliably test, whether a given underlying value has an actual implementation of the method set (Function1
and Function2
) defined by the interface?
I assume, this is solvable with reflect
package (performance is not an issue here). Maybe there's any other solutions thinkable? Type assertion didn't seem to work out for me...