是否有可能接收实现某个接口的所有结构?



我检查了reflect包文档,但没有找到任何东西。我要做的是找到所有的结构体,实现接口x。然后遍历所有的结构体来执行一个动作y。

使用这样的接口类型断言(playground链接)。我假设您有一些struct实例(可能在[]interface{}中,如下面的示例)。

package main
import "fmt"
type Zapper interface {
    Zap()
}
type A struct {
}
type B struct {
}
func (b B) Zap() {
    fmt.Println("Zap from B")
}
type C struct {
}
func (c C) Zap() {
    fmt.Println("Zap from C")
}
func main() {
    a := A{}
    b := B{}
    c := C{}
    items := []interface{}{a, b, c}
    for _, item := range items {
        if zapper, ok := item.(Zapper); ok {
            fmt.Println("Found Zapper")
            zapper.Zap()
        }
    }
}

您还可以动态地定义接口,并在循环中使用item.(interface { Zap() }),如果它是一次性的,并且您喜欢这种样式。

这不能在运行时完成,而只能通过静态地检查程序包(以及递归地检查所有导入)来完成。或者静态检查生成的。{o,a}文件。

但是,可以手动构建满足接口的类型列表(不限于结构,为什么?):

if _, ok := concreteInstance.(concreteInterface); ok {
        // concreteInstance satisfies concreteInterface
}

相关内容

  • 没有找到相关文章

最新更新