如何使用“The Way to Go”一书中的代码示例11.1中使用的接口?

时间:2015-06-04 03:24:34

标签: interface go

我正在学习Go并且正在尝试完全理解如何在Go中使用接口。

在The Way to Go中,有一个示例清单11.1(第264-265页)。我觉得我在理解它时肯定遗漏了一些东西。代码运行正常,但我不明白界面对结构和方法有什么影响(如果有的话)。

{{1}}

1 个答案:

答案 0 :(得分:1)

在该示例中,它没有效果。

接口允许不同类型遵守常用合同,允许您创建通用函数。

以下是Play

的修改示例

注意printIt函数,它可以采用任何符合Shaper接口的类型。

没有接口,你将不得不做 printCircle和printRectangle方法,随着时间的推移,随着您向应用程序添加越来越多的类型,它们并没有真正起作用。

package main

import (
    "fmt"
    "math"
)

type Shaper interface {
    Area() float32
}

type Square struct {
    side float32
}

func (sq *Square) Area() float32 {
    return sq.side * sq.side
}

type Circle struct {
    radius float32
}

func (c *Circle) Area() float32 {
    return math.Pi * c.radius * c.radius
}

func main() {
    sq1 := new(Square)
    sq1.side = 5
    circ1 := new(Circle)
    circ1.radius = 5
    var areaIntf Shaper
    areaIntf = sq1
    // areaIntf = sq1
    // shorter, without separate declaration:
    // areaIntf := Shaper(sq1)
    // or even:
    fmt.Printf("The square has area: %f\n", areaIntf.Area())
    areaIntf = circ1
    fmt.Printf("The circle has area: %f\n", areaIntf.Area())

    // Here is where interfaces are actually interesting
    printIt(sq1)
    printIt(circ1)
}

func printIt(s Shaper) {
    fmt.Printf("Area of this thing is: %f\n", s.Area())
}