美文网首页
2021-02-16

2021-02-16

作者: 陈光岚_强化班 | 来源:发表于2021-02-16 14:47 被阅读0次

    什么是接口?

    我们在结构和方法课程中讨论了很多关于对象和行为的内容。 我们学习了结构体(以及其他非结构类型)实现方法。 接口是一组方法签名的集合,然后我们可以定义一个结构体实现该接口所有方法。因此,接口就是定义了对象的行为。

    例如,结构体Dog可以walk和bark, 如果一个接口声明了walk和bark的方法签名,而Dog实现了walk和bark方法,那么Dog就实现了该接口。

    接口的主要工作是仅提供由方法名称,输入参数和返回类型组成的方法签名集合。 由类型(例如struct结构体)来声明方法并实现它们。

    如果您曾经是面向对象的程序员,您肯定会经常使用implements关键字来实现接口。 但是在go中,你没有明确提到一个类型是否实现了一个接口。 如果一个类型实现了在接口中定义的签名方法,则称该类型实现该接口。 就像说它像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫,那就是鸭子。

    定义接口

    与struct类似,我们需要使用类型别名,通过interface关键字来简化接口声明。

    type Shape interface {

        Area() float64

        Perimeter() float64

    }

    上面的代码中,我们定义了Shape接口,它有两个方法Area和Perimeter,他们不接收任何参数并返回float64。 任何实现这两个方法的类型我们都认为它实现了Shape接口。

    由于interface也是一种类型,我们可以创建它的类型的变量。 在上面的例子中,我们可以创建一个类8型为接口Shape的变量s。

    在我们对上面例子输出结果困惑前,让我解释一下。 接口有两种类型。 静态类型的接口是接口本身,例如上面的程序中的Shape。 接口没有静态值,而是指向动态值。 接口类型的变量可以保存实现接口的Type的值。 该类型的值成为接口的动态值,该类型成为接口的动态类型。

    从上面的结果,我们可以看到接口的值是nil而且接口的类型也是nil。 这是因为此时,接口不知道是谁会实现它。 当我们使用带有接口参数的fmt包中的Println函数时,它指向接口的动态值,而Printf函数中的%T语法指的是接口的动态类型。 但实际上,接口的类型是Shape。

    相关文章

      网友评论

          本文标题:2021-02-16

          本文链接:https://www.haomeiwen.com/subject/ydbvxltx.html