为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
叮当猫咪 2021-06-03 14:40:22
我检查了reflect包文档,但没有找到任何东西。我想要做的是找到所有实现接口 x 的结构。然后遍历所有结构以执行操作 y。
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

使用带有这样的接口的类型断言(playground link)。我假设您有一些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() })在循环中使用,如果它是一次性的并且您喜欢这种风格。


查看完整回答
反对 回复 2021-06-07
?
慕的地10843

TA贡献1785条经验 获得超8个赞

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


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


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

        // concreteInstance satisfies concreteInterface

}


查看完整回答
反对 回复 2021-06-07
  • 2 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信