【问题标题】:Interfaces vs struct methods接口与结构方法
【发布时间】:2018-09-22 15:52:00
【问题描述】:

我有带接口的代码:

package main

import (
    "math"
    "fmt"
)

type Circle struct {
    x, y, r float64
}

type Rectangle struct {
    x1, y1, x2, y2 float64
}

type Figure interface {
    Area() float64
}

func (c *Circle) Area() float64 {
    return math.Pi * c.r * c.r
}

func (r *Rectangle) Area() float64 {
    return math.Abs(r.x2 - r.x1) * math.Abs(r.y2 - r.y1)
}

func main() {
    figures := make([]Figure, 0)
    figures = append(figures, &Circle{0, 0, 10})
    figures = append(figures, &Rectangle{0, 0, 10, 20})
    for _, figure := range figures {
        fmt.Print(figure.Area(), "\n")
    }
}

输出:

314.159265
200

以及只为我的结构提供方法的代码:

package main

import (
    "math"
    "fmt"
)

type Circle struct {
    x, y, r float64
}

type Rectangle struct {
    x1, y1, x2, y2 float64
}

func (c *Circle) Area() float64 {
    return math.Pi * c.r * c.r
}

func (r *Rectangle) Area() float64 {
    return math.Abs(r.x2 - r.x1) * math.Abs(r.y2 - r.y1)
}

func main() {
    c := Circle{0,0,10}
    r := Rectangle{0,0,10,20}

    fmt.Print(c.Area(), "\n")
    fmt.Print(r.Area(), "\n")
}

同样的输出:

314.1592653589793
200

当我使用接口时,我有额外的接口声明形式的代码。如果接口完美地实现了 Go 中的多态性,那么为什么还要使用结构体的方法呢?接口加什么,区别在哪里?可能是我的例子不好。谢谢!

【问题讨论】:

标签: go struct interface


【解决方案1】:

您应该在自己的代码中看到它:在第一种情况下,您可以在 unity 中处理所有内容,作为 Figure 的值,因此您可以将它们存储在切片中(@987654323 类型@),并覆盖它们并调用它们的Area() 方法。

在没有接口的第二种情况下,您没有将它们存储在切片中,也没有使用循环,而是必须在每个实例上手动调用Area()

没有接口,就没有可以创建切片并将每个切片存储在其中的类型。唯一的选择是 interface{} 类型:

figures := make([]interface{}, 0)
figures = append(figures, &Circle{0, 0, 10})
figures = append(figures, &Rectangle{0, 0, 10, 20})

但是当覆盖它们时,您将无法调用它们的 Area() 方法,因为 interface{} 类型没有定义任何方法。

for _, figure := range figures {
    fmt.Print(figure.Area(), "\n") // COMPILE-TIME error
}

如果你只有 2 个实例,你可以手动调用它们的 Area() 方法,它会更短。但是如果你有一千个或一千个......

没有重复接口的优点,请查看可能的重复:
Why are interfaces needed in Golang?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2013-07-21
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多