這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
對於golang的介面,糾結兩天了,今天有種茅塞頓開的感覺,有必要寫點東西了。
糾結介面,說白了就是搞不透介面,方法,結構體幾者之間的關係以及具體的用途。可以簡單的從三者的定義說起,介面說白了就是一個方法(method)集,結構體就是一個類,通常儲存屬性,方法相當於類的函數,不過有兩種類型的接受者(對象),一種是值,一種是指標,指標能改變結構體中的屬性值。在go中,只要結構體的方法實現(包含)了介面中所有的方法,就可以說這個結構體實現了這個介面。定義講清楚後可以看看介面到底有什麼用了,接下來給出兩段代碼。
package main
import "fmt"
type act interface { //定義一個act介面,包含一個write方法
write()
}
type xiaoming struct { //xiaoming結構體
}
type xiaofang struct { //xiaofang結構體
}
func (xm *xiaoming) write() { //xiaoming結構體的方法write,接收者為指標類型。即xiaoming實現了act介面
fmt.Println("xiaoming write")
}
func (xf *xiaofang) write() { //同上,xiaofang實現了act介面
fmt.Println("xiaofang write")
}
func main() {
var w act
xm := xiaoming{}
xf := xiaofang{}
w = &xm //執行個體化介面,由於xm是指標類型的接收者,必須加&
w.write()
w = &xf //同上
w.write()
}
輸出結果為:xiaoming write
xiaofang write
這個例子同樣能說明go語言物件導向的多態性質。介面實際上是作為中間體調用結構體的方法。
第二個例子:
該介面有兩個方法,Area和Perimeter,並且分別寫了兩個Get方法,用來分別計算面積和周長(這一步其實是沒用的)
。隨後,分別定義了長方形和圓形的結構體,並且分別實現了 Shape 介面.
在 func main() {} 中,分別用了 Get 方法和調用 interface 成員方法去計算周長和面積,可以看出,
介面的作用就在於去作為"中間體"去調用結構體的成員方法
沒有必要再去對介面內部的方法進行重新定義!!總之,使用介面可以非常靈活,而且與具體的實現做瞭解耦,如果以後有其他的實作類別,只需要實現介面就可以了,而不用去改使用的時候的代碼。
type Rect struct { width, height float64 } func (r *Rect) area() float64 { return r.width * r.height } func (r *Rect) perimeter() float64 { return (r.height + r.width) * 2 } //------------圓形------------// type Circle struct { radius float64 } func (c *Circle) area() float64 { return math.Pi * c.radius * c.radius } func (c *Circle) perimeter() float64 { return 2 * math.Pi * c.radius }
作者: 鐵心木吉
連結:http://www.imooc.com/article/4579
來源:慕課網