Go语言示例 --16关于Interface接口

接口是对行为或函数集合的抽象,其定义了抽象的行为或函数。用户通过实现接口的抽象行为或函数来使用接口。接口是Golang的一个重要的概念,Inferface接口实际操作分两步,其一是声明Interface,其二是实现/使用Interface,如下文。


1. 声明Interface

定义一个几何Geometry接口,包含面积Area()和周长Perim()两个函数。

type Geometry interface {
    Area() float64
    Perim() float64
}


2. 实现/使用Interface

2.1. Case 1 – Rectangle (传值实现)

Rectange通过实现Geometry接口的所有抽象函数,来实现该接口。

package main
import "fmt"

type Geometry interface{ // The Geometry interface
    Area() float64
    Perim() float64
}

type Rectangle struct{ // Define Rectagle's own Data Structure
    width, height float64
}

func (r Rectangle) Area() float64 { // Implement the Area()
    return r.width * r.height
}

func (r Rectangle) Perim() float64 { // Implement the Perim()
    return 2*r.width + 2*r.height
}

func main(){
    r := Rectangle{width:3, height:4}
    fmt.Println(Geometry(r))
    fmt.Println(Geometry.Area(r))
    fmt.Println(Geometry.Perim(r))
}

要点一,接口的使用方法:用户通过接口+函数,来调用接口的某个函数,比如,Geometry.Area(Rectangle类型的参数r)。

要点二,Golang函数语法:func (r Rectangle) Area() float64表示Area()函数的输入值为Rectangle数据类型,返回值为float64数据类型——形式上等价于float64 Area(r Rectangle)。


2.2. Case 2 – Rectangle (传地址实现)

同样地,Rectange通过实现Geometry接口的所有抽象函数,来实现该接口。

package main
import "fmt"

type Geometry interface{ // The Geometry interface
    Area() float64
    Perim() float64
}

type Rectangle struct{ // Define Rectagle's own Data Structure
    width, height float64
}

func (r *Rectangle) Area() float64 { // Implement the Area()
    return r.width * r.height
}

func (r *Rectangle) Perim() float64 { // Implement the Perim()
    return 2*r.width + 2*r.height
}

func main(){
    r := Rectangle{width:3, height:4}
    fmt.Println(Geometry(&r))
    fmt.Println(Geometry.Area(&r))
    fmt.Println(Geometry.Perim(&r))
}

要点一,接口的使用方法:用户通过接口+函数,来调用接口的某个函数,比如,Geometry.Area(&r),注意,这里通过指针地址访问。

要点二,Golang函数语法:func (r *Rectangle) Area() float64表示Area()函数的输入值为指向Rectangle数据地址的指针类型。

要点三,传值操作通过临时变量不改变原始变量本身的值,而指针操作通过修改内存地址或其指向的内容直接改变变量本身或其值,所以,基于指针的操作或实现需要小心。


2.3. Case 3 – Circle (传值实现)

Circle通过实现Geometry接口的所有抽象函数,来实现该接口。

package main
import "fmt"
import "math"

type Geometry interface{ // The Geometry interface
    Area() float64
    Perim() float64
}

type Circle struct{ // Define Rectagle's own Data Structure
    radius float64
}

func (r Circle) Area() float64 { // Implement the Area()
    return math.Pi * r.radius * r.radius
}

func (r Circle) Perim() float64 { // Implement the Perim()
    return 2 * math.Pi * r.radius
}

func main(){
    r := Circle{radius:3}
    fmt.Println(Geometry(r))
    fmt.Println(Geometry.Area(r))
    fmt.Println(Geometry.Perim(r))
}

要点一,接口的使用方法:用户通过接口+函数,来调用接口的某个函数,比如,Geometry.Area(Circle类型的参数r)。

要点二,Golang函数语法:func (r Circle) Area() float64表示Area()函数的输入值为Circle数据类型,返回值为float64数据类型。



参考资料

[1. Golang by examples] https://gobyexample.com/interfaces


备注

[备注一] 初稿,2019年07月15号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值