为了账号安全,请及时绑定邮箱和手机立即绑定

验证一个接口满足另一个接口

验证一个接口满足另一个接口

Go
叮当猫咪 2021-05-05 22:57:31
我正在编写一个玩具包装的规范,尽管大多数规范都保证了包装中的各种结构都可以满足主要的公共接口,但我也对指定接口必须要求的方法感兴趣。我知道这不只是一个简单的方法,但我认为这将是一个整洁的实验,并且会施加压力以保持公共接口的稳定。这是我的第一次尝试: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个赞

简而言之,你做不到。没有办法只存储接口,因为它不是具体类型,而反射仅适用于具体类型。请参阅反射包及其文档。

无论如何,您想要做的事情似乎都是不必要的。该接口是您的规格。您看起来想要做的是编写一个规范来描述您的规范,一旦这样做,最大的问题就是您在哪里停下来。一直都是乌龟:-)


查看完整回答
反对 回复 2021-05-17
?
富国沪深

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

}


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信