接口的使用
本小节将教您如何在名为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)
}
在本部分中,将展示如何使用circle
和square
变量作为前面实现的Calculate()
函数的参数。
如果执行useInterface.go
,将得到以下输出:
$ go run useInterface.go
Perimeter: 40
Is a square: {10}
100
40
Is a circle!
78.53981633974483
31.41592653589793