gpt4 book ai didi

reflection - 验证一个接口(interface)满足另一个

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

我正在为我正在编写的玩具包编写规范,虽然大部分规范都保证包中的各种结构满足主要公共(public)接口(interface),但我也有兴趣指定接口(interface)必须的方法要求;我知道这有点迂腐,但我认为这将是一个很好的实验,并且会施加压力以保持公共(public)接口(interface)的稳定。

这是我的第一次尝试:

type Roller interface {
Min() int
}

type minS struct {}
func (m minS) Min() int {return 0}
func (m minS) Max() int {return 0}

func RollerSpec(c gospec.Context) {

var r Roller = minS{}

c.Specify("has a minimum value.", func() {
_, ok := r.(interface{Min() int})
c.Expect(ok, Equals, true)
})

c.Specify("has a maximum value.", func() {
_, ok := r.(interface{Max() int})
c.Expect(ok, Equals, true)
})

c.Specify("has an expected value.", func() {
_, ok := r.(interface{Exp() int})
c.Expect(ok, Equals, true)
})

c.Specify("can be rolled.", func() {
_, ok := r.(interface{Roll() int})
c.Expect(ok, Equals, true)
})
}

如您所见,我的 Roller 接口(interface)只需要 Min()minS 实现了这两个 Min()Max()。我通过了前两个规范,即使 Runner 不满足 interface{Max() int} 因为我用来测试它的虚拟类型满足。同样,在没有基类型的情况下声明 r 会导致它无法满足所有规范。

很明显,为什么 Go 会在接口(interface)之间对实际存储的类型进行类型断言,但这不是我在这里寻找的。我还检查了 reflect 包,但它似乎也只检查结构。有没有一种方法可以以编程方式检查接口(interface)是否需要给定方法,而无需自己拉入解析包并为方法名称爬取解析树?

最佳答案

简单地说,你不能。没有办法只存储一个接口(interface),因为它不是具体类型,反射只适用于具体类型。请参阅反射包及其文档。

无论如何,你想做的事情似乎都是不必要的。界面是您的规范。看起来你想要做的是编写一个规范来描述你的规范,一旦你这样做了,最大的问题就是你在哪里停下来。一路下来都是海龟:-)

关于reflection - 验证一个接口(interface)满足另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12189432/

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