go語言學習之路六:接口詳解

  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,而後將實現了這個接口的結構體賦值給了oGolang的接口不須要顯示的聲明,好處有:

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也能夠接受其餘變量。(若有錯誤之處,歡迎批評指出~)

相關文章
相關標籤/搜索