【发布时间】: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 中的多态性,那么为什么还要使用结构体的方法呢?接口加什么,区别在哪里?可能是我的例子不好。谢谢!
【问题讨论】:
-
您应该在自己的代码中看到它:在第一种情况下,您可以在 unity 中处理所有内容,作为
Figure的值,因此您可以将它们存储在切片中,并覆盖它们并调用它们的Area()方法。在没有接口的第二种情况下,您没有将它们存储在切片中,也没有使用循环,而是必须在每个实例上手动调用Area()。 Why are interfaces needed in Golang? 的可能重复项 -
我同意:“所以你可以将它们存储在一个切片中”,但在这两种情况下,我都描述了两个方法区域。不过谢谢你的回答!
-
为什么要使用接口?解耦代码。见stackoverflow.com/a/62297796/12817546。 “动态”调用方法。见stackoverflow.com/a/62336440/12817546。访问 Go 包。见stackoverflow.com/a/62278078/12817546。将任何值分配给变量。见stackoverflow.com/a/62337836/12817546。