Go語言沒有類和繼承的概念,可是接口的存在使得它能夠實現不少面向對象的特性。接口定義了一些方法,可是這些方法不包含實現的代碼。也就是說這些代碼沒有被實現(抽象的方法)。同時接口裏面也不包含變量。golang
看一個簡單的接口定義:編程
type inf interface {函數
Method1(param)spa
Method2(param)對象
}繼承
在go語言中接口通常包含0-3個方法。類型(如結構體)實現了接口中的方法,就是實現了接口,實現了接口類型的結構體變量能夠賦值給接口類型的變量,直接看一個例子幫助理解:接口
package mainget
import (string
"fmt"it
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
}
Output:value of the asset is 2308.800049
主函數中聲明瞭一個valueable的接口o,而後將實現了這個接口的結構體賦值給了o。Golang的接口不須要顯示的聲明,好處有:
1.在接口實現過程當中只要關心本身要提供哪些方法就行,不用糾結其餘。
2.不用擔憂其餘模塊定義過相似的接口,只要關心本身有什麼需求,而後按照需求去定義就行。
繼續看。咱們稍微加點料,代碼添加幾行以下:
package main
import (
"fmt"
)
type stockPosition struct {
ticker string
sharePrice float32
count float32
}
func (s stockPosition) getValue() float32 {
return s.sharePrice * s.count
}
type f float32
func (s f) getValue() float32 {
return 0.1
}
type valueable interface {
getValue() float32
}
func showValue(asset valueable) {
fmt.Printf("value of the asset is %f\n", asset.getValue())
}
func main() {
var o valueable
o = stockPosition{"GOOG", 577.20, 4}
showValue(o)
var t f
o = t
showValue(o)
}
Output:
value of the asset is 2308.800049
value of the asset is 0.100000
咱們定義了一個f,而後實現了getValue方法,其賦值給o,再調用valueable類型的接口才能夠調用的showValue打印值。也就是說全部實現了valueable接口的類型均可以調用這個函數。
總結下,golang不支持面向對象的編程思想(沒有類,沒有繼承),而要實現多態就徹底須要接口了。接口就是一組方法的集合,它對外隱藏了方法的實現。只要一個類型A實現了接口中的方法,這個接口的變量o就能夠接受類型A的變量,其餘的變量也實現了的話,也o也能夠接受其餘變量。(若有錯誤之處,歡迎批評指出~)