接口的使用

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

  1. >```go
  2. > package main
  3. >
  4. > import (
  5. > "fmt"
  6. > "math"
  7. > "myInterface"
  8. > )
  9. >
  10. > type square struct {
  11. > X float64
  12. > }
  13. >
  14. > type circle struct {
  15. > R float64
  16. > }
  17. >

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

  1. >```go
  2. > func (s square) Area() float64 {
  3. > return s.X * s.X
  4. > }
  5. >
  6. > func (s square) Perimeter() float64 {
  7. > return 4 * s.X
  8. > }
  9. >

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

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

  1. func (s circle) Area() float64 {
  2. return s.R * s.R * math.Pi
  3. }
  4. func (s circle) Perimeter() float64 {
  5. return 2 * s.R * math.Pi
  6. }

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

  1. >```go
  2. > func Calculate(x myInterface.Shape) {
  3. > _, ok := x.(circle)
  4. > if ok {
  5. > fmt.Println("Is a circle!")
  6. > }
  7. >
  8. > v, ok := x.(square)
  9. > if ok {
  10. > fmt.Println("Is a square:", v)
  11. > }
  12. >
  13. > fmt.Println(x.Area())
  14. > fmt.Println(x.Perimeter())
  15. > }
  16. >

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

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

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

  1. func main() {
  2. x := square{X: 10}
  3. fmt.Println("Perimeter:", x.Perimeter())
  4. Calculate(x)
  5. y := circle{R: 5}
  6. Calculate(y)
  7. }

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

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

  1. $ go run useInterface.go
  2. Perimeter: 40
  3. Is a square: {10}
  4. 100
  5. 40
  6. Is a circle!
  7. 78.53981633974483
  8. 31.41592653589793