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

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


叮当猫咪
浏览 215回答 2
2回答

慕尼黑5688855

使用带有这样的接口的类型断言(playground link)。我假设您有一些struct实例(可能在[]interface{}下面的示例中)。package mainimport "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() })在循环中使用,如果它是一次性的并且您喜欢这种风格。

慕的地10843

这不能在运行时完成,而只能通过检查程序包(以及递归的所有导入)静态完成。或者通过静态检查生成的 .{o,a} 文件。但是,可以手动构建满足接口的类型列表(不仅限于结构,为什么?):if _, ok := concreteInstance.(concreteInterface); ok {        // concreteInstance satisfies concreteInterface}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go