【go入坑教程】go中的接口到底是什么?

前提条件:对go中函数和方法这个概念有了解。

go接口描述:

  • 接口类型是由一组方法定义的集合。如何理解?接口的类型是一个集合,这个集合里面包含各种各样的方法。
  • 接口类型的值可以存放实现这些方法的任何值。如何理解?定义一个接口类型的变量,这个变量可以被赋值为任何实现了接口类型中方法的类型的对象。

代码讲解:

package main

import (
    "fmt"
    "math"
)

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if f < 0 {
        return float64(-f)
    }
    return float64(f)
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

type Abser interface {
    Abs() float64
}

func main() {
    var a Abser
    f := MyFloat(-math.Sqrt2)
    v := Vertex{3, 4}

    a = f  // a MyFloat 实现了 Abser
    a = &v // a *Vertex 实现了 Abser

    fmt.Println(a.Abs())
}

跟c++类比的话,与多态有些类似。多态的核心是:利用父类指针调用子类方法。go中接口也可以总结为:利用接口对象a,调用实现类型MyFloat/Vertex的方法。

注意点:

由于abs()方法绑定到的是Vertex指针类型上,所以Vertex本身类型是不能实现Abser接口的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值