我想反思确定Go界面是否包含某些方法签名。我已经动态地获取了名称和签名,之前通过结构上的reflect
离子。这是一个简化的例子:
package main
import "reflect"
func main() {
type Mover interface {
TurnLeft() bool
// TurnRight is missing.
}
// How would I check whether TurnRight() bool is specified in Mover?
reflect.TypeOf(Mover).MethodByName("TurnRight") // would suffice, but
// fails because you can't instantiate an interface
}
答案 0 :(得分:7)
您可以使用此技巧为类型创建reflect.Type
:
tp := reflect.TypeOf((*Mover)(nil)).Elem()
也就是说,创建一个类型化的nil指针,然后获取它指向的类型。
确定reflect.Type
是否实现特定方法签名的一种简单方法是使用其Implements
方法和适当的接口类型。这样的事情应该做:
type TurnRighter interface {
TurnRight() bool
}
TurnRighterType := reflect.TypeOf((*TurnRighter)(nil)).Elem()
fmt.Println(tp.Implements(TurnRighterType))