【问题标题】:How to check if interface specifies method using reflection如何检查接口是否使用反射指定方法
【发布时间】:2019-11-26 05:47:37
【问题描述】:

我想通过反射来确定一个 Go 接口是否包含某些方法签名。我之前通过结构上的reflection 动态获得了名称和签名。这是一个简化的示例:

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。感谢您的帮助!

【问题讨论】:

    标签: reflection go


    【解决方案1】:

    你可以用这个技巧为一个类型创建一个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))
    

    【讨论】:

    • 谢谢,这很狡猾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2021-08-20
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多