苦苦于看到接口类型的目的

Jam*_*ker 1 interface go

我最近喜欢Go编程语言,到目前为止我发现它很精彩,但我真的很难理解接口.我已经阅读了很多关于它们的内容,但它们对我来说似乎仍然非常抽象.

我写了一些使用以下界面的代码:

package main

import (
  "fmt"
  "math"
)

type Circer interface {
    Circ() float64
}

type Square struct {
    side float64
}

type Circle struct {
    diam, rad float64
}

func (s *Square) Circ() float64 {
    return s.side * 4
}

func (c *Circle) Circ() float64 {
    return c.diam * math.Pi
}

func (c *Circle) Area() float64 {
    if c.rad == 0 {
        var rad = c.diam / 2
        return (rad*rad) * math.Pi
    } else {
        return (c.rad*c.rad) * math.Pi
    }
}

func main() {

    var s = new(Square)
    var c = new(Circle)

    s.side = 2
    c.diam = 10

    var i Circer = s

    fmt.Println("Square Circ: ", i.Circ())

    i = c

    fmt.Println("Circle Circ: ", i.Circ())
}
Run Code Online (Sandbox Code Playgroud)

我无法真正看到Circer界面的目的.这些方法已经编写好了,我可以直接在结构上调用它们来保存两行代码,而不是使用Circer作为包装器.

有什么我想念的吗?我是否错误地使用了界面?任何帮助或示例表示赞赏.

Nic*_*ood 8

接口的关键是你可以制作ShowMeTheCircumference如下的通用功能.

package main

import (
    "fmt"
    "math"
)

type Circer interface {
    Circ() float64
}

type Square struct {
    side float64
}

type Circle struct {
    diam, rad float64
}

func (s *Square) Circ() float64 {
    return s.side * 4
}

func (c *Circle) Circ() float64 {
    return c.diam * math.Pi
}

func ShowMeTheCircumference(name string, shape Circer) {
    fmt.Printf("Circumference of %s is %f\n", name, shape.Circ())
}

func main() {
    square := &Square{side: 2}
    circle := &Circle{diam: 10}
    ShowMeTheCircumference("square", square)
    ShowMeTheCircumference("circle", circle)

}
Run Code Online (Sandbox Code Playgroud)

游乐场链接