猿问
是否可以接收实现某个接口的所有结构?
我检查了
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() })在循环中使用,如果它是一次性的并且您喜欢这种风格。
0
0
0
慕的地10843
这不能在运行时完成,而只能通过检查程序包(以及递归的所有导入)静态完成。或者通过静态检查生成的 .{o,a} 文件。但是,可以手动构建满足接口的类型列表(不仅限于结构,为什么?):if _, ok := concreteInstance.(concreteInterface); ok { // concreteInstance satisfies concreteInterface}
0
0
0
随时随地看视频
慕课网APP
相关分类
Go
我要回答