2 回答
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() })在循环中使用,如果它是一次性的并且您喜欢这种风格。
TA贡献1785条经验 获得超8个赞
这不能在运行时完成,而只能通过检查程序包(以及递归的所有导入)静态完成。或者通过静态检查生成的 .{o,a} 文件。
但是,可以手动构建满足接口的类型列表(不仅限于结构,为什么?):
if _, ok := concreteInstance.(concreteInterface); ok {
// concreteInstance satisfies concreteInterface
}
- 2 回答
- 0 关注
- 214 浏览
添加回答
举报