我正在编写一个玩具包装的规范,尽管大多数规范都保证了包装中的各种结构都可以满足主要的公共接口,但我也对指定接口必须要求的方法感兴趣。我知道这不只是一个简单的方法,但我认为这将是一个整洁的实验,并且会施加压力以保持公共接口的稳定。这是我的第一次尝试: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在接口之间的类型断言会在实际的存储类型上起作用,但这不是我在这里寻找的。我也检查了反射包,但似乎它也只检查结构。有没有一种方法可以以编程方式检查接口是否需要给定的方法,而无需自己提取解析包并为方法名称爬网解析树?
2 回答
撒科打诨
TA贡献1934条经验 获得超2个赞
简而言之,你做不到。没有办法只存储接口,因为它不是具体类型,而反射仅适用于具体类型。请参阅反射包及其文档。
无论如何,您想要做的事情似乎都是不必要的。该接口是您的规格。您看起来想要做的是编写一个规范来描述您的规范,一旦这样做,最大的问题就是您在哪里停下来。一直都是乌龟:-)
富国沪深
TA贡献1790条经验 获得超9个赞
具有单独接口的简单类型断言应该做到这一点。
type minRoller interface {
Min() int
}
type maxRoller interface {
Max() int
}
并在您的测试中:
if _, ok := r.(minRoller); ok {
print("has a min value")
}
if _, ok := r.(maxRoller); ok {
print("has a max value")
}
您的Roller界面可以嵌入较小的界面:
type MinRoller interface {
minRoller
}
type MinMaxRoller interface {
minRoller
maxRoller
}
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报
0/150
提交
取消