英文:
How to check if interface specifies method using reflection
问题
我想要通过反射来确定一个Go接口是否包含特定的方法签名。我之前通过在结构体上使用reflect
进行动态获取名称和签名。这里是一个简化的例子:
package main
import "reflect"
func main() {
type Mover interface {
TurnLeft() bool
// TurnRight is missing.
}
// 我该如何检查Mover接口是否指定了TurnRight() bool方法?
reflect.TypeOf(Mover).MethodByName("TurnRight") // 这样就足够了,但是
// 失败,因为无法实例化一个接口
}
你可以在这里查看示例代码:http://play.golang.org/p/Uaidml8KMV。谢谢你的帮助!
英文:
I want to reflect to determine whether or not a Go interface contains certain method signatures. I've dynamically got the names and signatures, previously through reflect
ion on a struct. Here's a simplified example:
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
}
http://play.golang.org/p/Uaidml8KMV. Thanks for your help!
答案1
得分: 9
你可以使用以下方法为类型创建一个reflect.Type
:
tp := reflect.TypeOf((*Mover)(nil)).Elem()
也就是说,创建一个具有指定类型的空指针,然后获取它所指向的类型。
要确定一个reflect.Type
是否实现了特定的方法签名,可以使用其Implements
方法和适当的接口类型。可以像这样使用:
type TurnRighter interface {
TurnRight() bool
}
TurnRighterType := reflect.TypeOf((*TurnRighter)(nil)).Elem()
fmt.Println(tp.Implements(TurnRighterType))
这样做应该可以实现你的需求。
英文:
You can create a reflect.Type
for a type with this trick:
tp := reflect.TypeOf((*Mover)(nil)).Elem()
That is, create a typed nil pointer and then get the type of what it points at.
A simple way to determine if a reflect.Type
implements a particular method signature is to use its Implements
method with an appropriate interface type. Something like this should do:
type TurnRighter interface {
TurnRight() bool
}
TurnRighterType := reflect.TypeOf((*TurnRighter)(nil)).Elem()
fmt.Println(tp.Implements(TurnRighterType))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论