Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
104 lines (84 sloc) 2.37 KB

接口的使用

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

useInterface.go的第一部分在以下Go代码中:

package main

import (
    "fmt"
    "math"
    "myInterface"
)

type square struct {
    X float64
}

type circle struct {
    R float64
}

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

useInterface.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接口。

useInterface.go的第四部分包含以下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
You can’t perform that action at this time.