gpt4 book ai didi

interface - 从任意接口(interface)列表中满足哪些接口(interface)?

转载 作者:IT王子 更新时间:2023-10-29 01:34:03 29 4
gpt4 key购买 nike

有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。

例如,给定:

type Mover interface  { Move() }
type Talker interface { Talk() }
type Flyer interface { Fly() }

type Person struct{}
func (a *Person) Move() {fmt.Println("Moving...") }
func (a *Person) Talk() {fmt.Println("Talking...") }

我可以手动测试每个接口(interface)如下:

func testInterfaces(entity interface{}) {

_, ok := entity.(Mover)
if ok {
fmt.Println("mover")
}
_, ok := entity.(Talker)
if ok {
fmt.Println("talker")
}
_, ok := entity.(Flyer)
if ok {
fmt.Println("flyer")
}
}

对于 Person 值,将打印“mover”和“talker”。但是,我宁愿有这样的功能(非工作):

func testInterfaces2(entity interface{}, interfaceList type??) {
for _, inter := range interfaceList {
val, ok := entity.(inter)
if ok {
// do something with val
}
}
}

有没有办法可以实现类似这个伪函数的东西,也许是通过反射包或其他方式?

最佳答案

你可以使用 this获取接口(interface)类型的一部分。

然后,您可以检查您的值的Type 是否实现了here 中的接口(interface)。 :

interfaces := []reflect.Type{reflect.TypeOf((*Mover)(nil)).Elem(), 
reflect.TypeOf((*Talker)(nil)).Elem(),
reflect.TypeOf((*Flyer)(nil)).Elem()}
p := &Person{}
t := reflect.TypeOf(p)
name := t.Elem().Name()
for _, interf := range interfaces {
if t.Implements(interf) {
fmt.Printf("%s is a %s\n", name, interf.Name())
} else {
fmt.Printf("%s is NOT a %s\n", name, interf.Name())
}
}

但我认为如果可能的话,最好使用类型开关

关于interface - 从任意接口(interface)列表中满足哪些接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570193/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com