Go:检查接口是否使用反射指定方法

atp*_*atp 5 reflection go

我想反思确定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
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/Uaidml8KMV.谢谢你的帮助!

Jam*_*dge 7

您可以reflect.Type使用此技巧创建一个类型:

tp := reflect.TypeOf((*Mover)(nil)).Elem()
Run Code Online (Sandbox Code Playgroud)

也就是说,创建一个类型化的nil指针,然后获取它指向的类型.

确定reflect.Type实现特定方法签名的简单方法是使用其Implements方法和适当的接口类型.这样的事情应该做:

type TurnRighter interface {
    TurnRight() bool
}
TurnRighterType := reflect.TypeOf((*TurnRighter)(nil)).Elem()
fmt.Println(tp.Implements(TurnRighterType))
Run Code Online (Sandbox Code Playgroud)