对于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语言面向对象的多态性质。接口实际上是作为中间体调用结构体的方法。

  第二个例子:

go通过zabbix接口获取数据 go中的接口_多态

go通过zabbix接口获取数据 go中的接口_多态_02

go通过zabbix接口获取数据 go中的接口_慕课网_03


接口的作用就在于去作为"中间体"去调用结构体的成员方法

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


    


type Rect struct { width, height float64 } func (r *Rect) area() float64 { return r.width * r.height } func (r *Rect) perimeter() float64 { return (r.height + r.width) * 2 } //------------圆形------------// type Circle struct { radius float64 } func (c *Circle) area() float64 { return math.Pi * c.radius * c.radius } func (c *Circle) perimeter() float64 { return 2 * math.Pi * c.radius }


作者: 铁心木吉