什么是接口
接口就是一組方法的集合舆声。比如下面這個(gè)例子,幾何圖形接口就包含了面積與周長(zhǎng)兩個(gè)方法柳爽,對(duì)于任何實(shí)現(xiàn)了這兩個(gè)方法的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為例,你需要顯式地創(chuàng)建一個(gè)類去實(shí)現(xiàn)一個(gè)接口娩脾,這種就是侵入式接口赵誓。
public interface Geometry {
public float Area();
}
public class Rect implements Geometry {
...
@override
public float Area(){
....
}
}
而golang的例子中,我們并沒(méi)有在代碼的任何地方告訴React或者Circle這兩個(gè)struct它們需要去實(shí)現(xiàn)Geometry接口,而是直接實(shí)現(xiàn)了接口中的兩個(gè)方法柿赊。而當(dāng)它們實(shí)現(xiàn)了這兩個(gè)方法之后俩功,它們就成為了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)
非侵入式接口的好處
最最重要的好處是,不用為了實(shí)現(xiàn)一個(gè)接口而導(dǎo)入一個(gè)包了碰声。想實(shí)現(xiàn)一個(gè)接口诡蜓,直接實(shí)現(xiàn)它包含的方法就好了。
另外就是胰挑,不用在寫(xiě)類型的時(shí)候先想怎么設(shè)計(jì)接口的問(wèn)題蔓罚,直接把需要提供的方法全寫(xiě)了就成。至于哪個(gè)方法是哪個(gè)接口的瞻颂,不用太操心豺谈。