我正在写我正在编写的玩具包装的规范,尽管大多数规范都保证了包装中的各种结构都能满足主要的公共(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)是您的规格。您看起来想要做的是编写一个规范来描述您的规范,一旦这样做,最大的问题就是您在哪里停止。一直都是乌龟:-)

10-07 13:13
查看更多