go中的接口

对于golang的接口,纠结两天了,今天有种茅塞顿开的感觉,有必要写点东西了。

  纠结接口,说白了就是搞不透接口,方法,结构体几者之间的关系以及具体的用途。可以简单的从三者的定义说起,接口说白了就是一个方法(method)集,结构体就是一个类,通常保存属性,方法相当于类的函数,不过有两种类型的接受者(对象),一种是值,一种是指针,指针能改变结构体中的属性值。在go中,只要结构体的方法实现(包含)了接口中所有的方法,就可以说这个结构体实现了这个接口。定义讲清楚后可以看看接口到底有什么用了,接下来给出两段代码。

    package main

    import "fmt"

    type act interface {                                       //定义一个act接口,包含一个write方法

      write()

  }

  type xiaoming struct {                                    //xiaoming结构体

  }

  type xiaofang struct {                                     //xiaofang结构体

   }

  func (xm *xiaoming) write() {                         //xiaoming结构体的方法write,接收者为指针类型。即xiaoming实现了act接口

    fmt.Println("xiaoming write")

  }

  func (xf *xiaofang) write() {                          //同上,xiaofang实现了act接口

    fmt.Println("xiaofang write")

  }

  func main() {

    var w act                                      

    xm := xiaoming{}

    xf := xiaofang{}

    w = &xm                                          //实例化接口,由于xm是指针类型的接收者,必须加&

    w.write()

    w = &xf                                           //同上

    w.write()

  }

  输出结果为:xiaoming write
        xiaofang write

  这个例子同样能说明go语言面向对象的多态性质。接口实际上是作为中间体调用结构体的方法。

  第二个例子:

该接口有两个方法,Area和Perimeter,并且分别写了两个Get方法,用来分别计算面积和周长(这一步其实是没用的)

。随后,分别定义了长方形和圆形的结构体,并且分别实现了 Shape 接口.

在 func main() {} 中,分别用了 Get 方法和调用 interface 成员方法去计算周长和面积,可以看出, 接口的作用就在于去作为"中间体"去调用结构体的成员方法

没有必要再去对接口内部的方法进行重新定义!!总之,使用接口可以非常灵活,而且与具体的实现做了解耦,如果以后有其他的实现类,只需要实现接口就可以了,而不用去改使用的时候的代码。

猜你喜欢

转载自www.cnblogs.com/soundcode/p/9559486.html
今日推荐