Go筆記-接口(interface)

Go中的接口(interface)

  Go不是傳統的面向對象編程,因此沒有類的概念。可是它有靈活的接口(interface)在必定程度上能實現面向對象的不少特性。編程

Go中接口的特色

  • 接口定義了一組抽象的方法集,沒有被實現的
  • 接口中不能包含變量

接口的定義格式

 1 type Namer interface{ 2 Method1(param_list)return_type 3 Method2(param_list)return_type 4 } 數據結構

接口值

  在Go語言中接口能夠有值,一個接口類型的變量或一個接口值是一個多字節數據結構,它的值是nil。它本質上是一個指針,雖然不徹底是一回事。指向接口值的指針是非法的。lua

  類型(好比結構體)實現接口方法集中的方法,每個方法的實現說明了此方法是如何做用於該類型的:即實現接口(實現接口中全部方法,纔算是接口實現),同時方法集也構成了該類型的接口。實現了 Namer 接口類型的變量能夠賦值給 ai (接收者值),此時方法表中的指針會指向被實現的接口方法。固然若是另外一個類型(也實現了該接口)的變量被賦值給 ai,這兩者(譯者注:指針和方法實現)也會隨之改變(能夠認爲是Go中所表現的多態)。spa

  • 類型不須要顯式聲明它實現了某個接口:接口被隱式地實現。多個類型能夠實現同一個接口。
  • 實現某個接口的類型(除了實現接口方法外)能夠有其餘的方法。
  • 一個類型能夠實現多個接口。
  • 接口類型能夠包含一個實例的引用, 該實例的類型實現了此接口(接口是動態類型)。
  • 即便接口在類型以後才定義,兩者處於不一樣的包中,被單獨編譯:只要類型實現了接口中的方法,它就實現了此接口。
  • 全部這些特性使得接口具備很大的靈活性。

 Go多態

 1 package main
 2 
 3 import "fmt"
 4 
 5 type valuable interface {
 6     getValue() float32
 7 }
 8 
 9 type stockPosition struct {
10     ticker     string
11     sharePrice float32
12     count      float32
13 }
14 
15 func (s stockPosition) getValue() float32 {
16     return s.sharePrice * s.count
17 }
18 
19 type car struct {
20     make  string
21     model string
22     price float32
23 }
24 
25 func (c car) getValue() float32 {
26     return c.price
27 }
28 
29 func showValue(v valuable) {
30     fmt.Printf("value of the asset is %f\n", v.getValue())
31 }
32 
33 func main() {
34     var o valuable = stockPosition{"Golang", 99.9, 4}
35     showValue(o)
36     o = car{"BMW", "M3", 66500}
37     showValue(o)
38 }

 使用方法集與接口

  在接口上調用方法時,必須有和方法定義時相同的接收者類型或者是能夠從具體類型 P 直接能夠辨識的:指針

  • 指針方法能夠經過指針調用
  • 值方法能夠經過值調用
  • 接收者是值的方法能夠經過指針調用,由於指針會首先被解引用
  • 接收者是指針的方法不能夠經過值調用,由於存儲在接口中的值沒有地址

  將一個值賦值給一個接口時,編譯器會確保全部可能的接口方法均可以在此值上被調用,所以不正確的賦值在編譯期就會失敗。code

相關文章
相關標籤/搜索