接口就是一组方法的集合。比如下面这个例子,几何图形接口就包含了面积与周长两个方法,对于任何实现了这两个方法的type,都属于几何图形。
type Geometry interface {
Area() float64
Perim() float64
}
type Rect struct {
Width, Height float64
}
type Circle struct {
Radius float64
}
func (r Rect) Area() float64 {
return r.Width * r.Height
}
func (r Rect) Perim() float64 {
return 2 * (r.Width + r.Height)
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
func (c Circle) Perim() float64 {
return math.Pi * c.Radius * 2
}
首先你需要知道什么叫侵入式接口。以java为例,你需要显式地创建一个类去实现一个接口,这种就是侵入式接口。
public interface Geometry {
public float Area();
}
public class Rect implements Geometry {
...
@override
public float Area(){
....
}
}
而golang的例子中,我们并没有在代码的任何地方告诉React或者Circle这两个struct它们需要去实现Geometry接口,而是直接实现了接口中的两个方法。而当它们实现了这两个方法之后,它们就成为了Geometry
func Measure(g Geometry) {
fmt.Println(g)
fmt.Println(g.Area())
fmt.Println(g.Perim())
}
r := Rect{3,5}
c := Circle{4}
Measure(r)
Measure(c)
最最重要的好处是,不用为了实现一个接口而导入一个包了。想实现一个接口,直接实现它包含的方法就好了。 另外就是,不用在写类型的时候先想怎么设计接口的问题,直接把需要提供的方法全写了就成。至于哪个方法是哪个接口的,不用太操心。
本文来自:简书
感谢作者:bigtom
查看原文:go的非侵入式接口