go中的接口
對于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 成員方法去計算周長和面積,可以看出,接口的作用就在于去作為"中間體"去調用結構體的成員方法??沒有必要再去對接口內部的方法進行重新定義!!總之,使用接口可以非常靈活,而且與具體的實現做了解耦,如果以后有其他的實現類,只需要實現接口就可以了,而不用去改使用的時候的代碼。總結
- 上一篇: Go 语言中的 new() 和 make
- 下一篇: 马蜂窝的民间偏方(露蜂房的功效与作用)