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