接口的使用

本小节将教您如何在名为useInterface.go的Go程序中使用myInterface.go中定义的接口,该程序将分五部分介绍。


>```go
> package main
> 
> import (
>     "fmt"
>     "math"
>     "myInterface"
> )
>
> type square struct {
>     X float64
> }
>
> type circle struct {
>     R float64
> }
>

由于所需的接口定义在它自己的包中,所以需要导入myInterface包。


>```go
> func (s square) Area() float64 {
>     return s.X * s.X
> }
>
> func (s square) Perimeter() float64 {
>     return 4 * s.X
> }
>

在本部分中,类型square实现了shape接口。

第三部分包含以下Go代码:

func (s circle) Area() float64 {
    return s.R * s.R * math.Pi
}

func (s circle) Perimeter() float64 {
    return 2 * s.R * math.Pi
}

在本部分中,类型circle实现了shape接口。


>```go
> func Calculate(x myInterface.Shape) {
>     _, ok := x.(circle)
>     if ok {
>         fmt.Println("Is a circle!")
>     }
>
>     v, ok := x.(square)
>     if ok {
>         fmt.Println("Is a square:", v)
>     }
>
>     fmt.Println(x.Area())
>     fmt.Println(x.Perimeter())
> }
>

在上面的代码中,实现了一个需要shape参数(myInterface.Shape)的函数。这里需要理解注意的是函数参数是任何shape类型的参数,也就是实现shape接口的类型!

函数开头的代码展示了如何区分实现接口的数据类型。在第二个代码块中,将看到如何获取存储在square参数中的值。对实现myInterface.Shape的任何类型都可以使用这样的方式。

最后一个代码段包括以下代码:

func main() {
    x := square{X: 10}
    fmt.Println("Perimeter:", x.Perimeter())
    Calculate(x)
    y := circle{R: 5}
    Calculate(y)
}

在本部分中,将展示如何使用circlesquare变量作为前面实现的Calculate()函数的参数。

如果执行useInterface.go,将得到以下输出:

$ go run useInterface.go
Perimeter: 40
Is a square: {10}
100
40
Is a circle!
78.53981633974483
31.41592653589793
最后编辑: kuteng  文档更新时间: 2021-03-27 20:14   作者:kuteng