如何使用反射检查接口是否指定了方法。

huangapple go评论78阅读模式
英文:

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 reflection 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))

huangapple
  • 本文由 发表于 2013年11月16日 14:52:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/20015695.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定