我正在写我正在编写的玩具包装的规范,尽管大多数规范都保证了包装中的各种结构都能满足主要的公共(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)之间具有类型声明才能处理实际的存储类型,但这不是我在这里寻找的。我还检查了反射包,但似乎它也只检查结构。有没有一种方法可以以编程方式检查接口(interface)是否需要给定方法,而无需自己提取解析包并为方法名称爬网解析树?
最佳答案
简单地说,你做不到。没有办法只存储接口(interface),因为它不是具体类型,而反射仅适用于具体类型。请参阅反射包及其文档。
无论如何,您想要做的事情似乎都是不必要的。该接口(interface)是您的规格。您看起来想要做的是编写一个规范来描述您的规范,一旦这样做,最大的问题就是您在哪里停止。一直都是乌龟:-)