我正在编写一个玩具包装的规范,尽管大多数规范都保证了包装中的各种结构都可以满足主要的公共接口,但我也对指定接口必须要求的方法感兴趣。我知道这不只是一个简单的方法,但我认为这将是一个整洁的实验,并且会施加压力以保持公共接口的稳定。
这是我的第一次尝试:
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界面仅需要Min()但minS实现Min()和Max()。我通过前两个规格,即使Runner不满足interface{Max() int},因为虚拟I型用它来测试它。同样,声明r不带基本类型会导致它不符合所有规范。
很明显,为什么Go在接口之间的类型断言会在实际的存储类型上起作用,但这不是我在这里寻找的。我也检查了反射包,但似乎它也只检查结构。有没有一种方法可以以编程方式检查接口是否需要给定的方法,而无需自己提取解析包并为方法名称爬网解析树?
撒科打诨
富国沪深
相关分类