golang面向對象思想和實現

golang中並無明確的面向對象的說法,實在要扯上的話,能夠將struct比做其它語言中的class。php

類聲明

type Poem struct {
	Title  string
	Author string
	intro  string
}


這樣就聲明瞭一個類,其中沒有public、protected、private的的聲明。golang用另一種作法來實現屬性的訪問權限:屬性的開頭字母是大寫的則在其它包中能夠被訪問,不然只能在本包中訪問。類的聲明和方法亦是如此。java

類方法聲明

func (poem *Poem) publish() {
	fmt.Println("poem publish")
}

或者golang

func (poem Poem) publish() {
	fmt.Println("poem publish")
}

和其它語言不同,golang聲明方法和普通方法一致,只是在func後增長了poem *Poem這樣的聲明。加*和沒有加*的區別在於一個是傳遞指針對象,一個是傳遞值對象。函數

實例化對象

實例化對象有好幾種方式spa

poem := &Poem{}
	poem.Author = "Heine"
	poem2 := &Poem{Author: "Heine"}
	poem3 := new(Poem)
	poem3.Author = "Heine"
	poem4 := Poem{}
	poem4.Author = "Heine"
	poem5 := Poem{Author: "Heine"}

實例化的時候能夠初始化屬性值,若是沒有指明則默認爲系統默認值設計

加&符號和new的是指針對象,沒有的則是值對象,這點和php、java不一致,在傳遞對象的時候要根據實際狀況來決定是要傳遞指針仍是值。指針

tips:當對象比較小的時候傳遞指針並不划算。code

構造函數

查看官方文檔,golang並無構造函數一說。若是必定要在初始化對象的時候進行一些工做的話,能夠自行封裝產生實例的方法。對象

func NewPoem(param string, p ...interface{}) *Poem

示例:繼承

func NewPoem(author string) (poem *Poem) {
    poem = &Poem{}
    poem.Author = author
    return
}
 
poem6 := NewPoem("Heine")

繼承

確切的說golang中叫作組合(composition)

type Poem struct {
    Title  string
    Author string
    intro  string
}
 
type ProsePoem struct {
    Poem
    Author string
}

ProsePoem屬性中聲明瞭Poem,表示組合了Poem的屬性和方法。能夠像以下方式調用:

prosePoem := &ProsePoem{}
prosePoem.author = "Heine"

若是其中屬性有衝突,則之外圍的爲主。

type ProsePoem struct {
    Poem
    Author string
}

當訪問Author的時候默認爲ProsePoem的Author,若是須要訪問Poem的Author屬性可使用prosePoem.Poem.Author來訪問。

prosePoem := &ProsePoem{}
prosePoem.Author = "Shelley"
prosePoem.Poem.Author = "Heine"
fmt.Println(prosePoem)

從輸出中能夠很直觀看到這一點。

&{{ Heine } Shelley}

方法的繼承和屬性一致,這裏再也不羅列。經過組合的話能夠很好的實現多繼承。

方法重載

方法重載就是一個類中能夠有相同的函數名稱,可是它們的參數是不一致的,在java、C++中這種作法廣泛存在。golang中若是嘗試這麼作會報從新聲明(redeclared)錯誤,可是golang的函數能夠聲明不定參數,這個很是強大。

func (poem *Poem) recite(v ...interface{}) {
    fmt.Println(v)
}

其中v …interface{}表示參數不定的意思,其中v是slice類型,fmt.Println方法也是這樣定義的。若是要根據不一樣的參數實現不一樣的功能,要在方法內檢測傳遞的參數。

接口

關於面向對象中還一個重要的東西就是接口了,golang中的接口和其它語言都不太同樣,是golang值得稱道設計之一。詳細瞭解接口還須要一段時間,下次再分享吧。

相關文章
相關標籤/搜索