Go語言中的複合類型及物件導向思想

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

1、結構體 struct

定義格式:

type 結構體名稱 struct {    屬性1    類型    屬性2    類型    ...}

結構體的初始化可以使用new關鍵詞和var關鍵詞,不同的是如果使用new,則傳回型別是一個指標,使用var,則是結構體自身。

type User struct {    name    string    age     int}user := new(User)user.name = "tom"user.age = 20fmt.Println(user) //輸出&{tom 20}

上例中使用new來初始化一個結構體,user的類型就是*User,在輸出內容中的&字元號也表現了這點。接下來看下使用var的情況:

type User struct {    name    string    age     int}var user Useruser.name = "tom"user.age = 20fmt.Println(user) //輸出{tom 20}

這裡輸出中沒有&符號了。

如果結構體屬性比較多,每個屬性初始化都要一行,代碼就顯的比較冗長,Go語言提供更簡潔的寫法:

type User struct {    name    string    age     int}user := User{"tom", 20} //按順序給屬性賦值//user := User{age: 20, name: "tom"} //指明屬性賦值fmt.Println(user)

要注意的就是如果不指明屬性,就是按照結構體內屬性的先後順序進行賦值。

2、數組 array

數組使用很廣泛,很多語言都有會有數組的實現。

定義格式:

[長度]類型{初始化值}

其中長度可以省略或者換成三個點“…”,如果這麼做的話,系統會根據初始化的值自動定義數組的長度。

簡單的樣本:

arr := [2]int{3, 2}//arr := []int{3, 2} //arr := [...]int{3, 2}fmt.Println(arr)  //輸出[3 2]

如果指明了長度,但是沒有初始值,則會根據數群組類型初始化每個值

arr := [5]int{}fmt.Println(arr) //輸出[0 0 0 0 0]

3、切片 slice

切片可以和數組很好的配合使用,可以用來擷取數組中一段資料。格式:

陣列變數[開始索引:結束索引]

其中不包括結束索引。

arr := [5]int{3,4,5,6,7}slice := arr[0:3]fmt.Println(slice) //輸出[3 4 5]

切片也可以用於字串:

str := "Anny is a beautiful girl."fmt.Print(str[0:6]) //輸出Anny i

4、字典 map

在Go語言數組中,字串是不能做索引值的,我覺著字典很好的彌補了這個不足。

字典定義格式:

map[鍵類型] 實值型別 {    鍵: 值,    ....}

一個簡單樣本:

ages := map[string] int {    "tom": 21,    "anny": 18,}fmt.Println(ages["tom"])

使用字典時,還能動態添加字典元素,也很方便。

ages := map[string] int {    "tom": 21,    "anny": 18,}ages["jack"] = 20fmt.Println(len(ages))

如果鍵在字典裡是不存在的,則返回一個預設值,預設值根據不同的類型決定。

ages := map[string] int {    "tom": 21,    "anny": 18,}fmt.Println(ages["jack"]) //輸出0
 

轉載請註明:快樂編程 » Go語言的複合資料型別struct,array,slice,map

golang中並沒有明確的物件導向的說法,實在要扯上的話,可以將struct比作其它語言中的class。

類聲明

type Poem struct {Title  stringAuthor stringintro  string}

這樣就聲明了一個類,其中沒有public、protected、private的的聲明。golang用另外一種做法來實現屬性的存取權限:屬性的開頭字母是大寫的則在其它包中可以被訪問,否則只能在本包中訪問。類的聲明和方法亦是如此。

類方法聲明

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

或者

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

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

執行個體化對象

執行個體化對象有好幾種方式

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:當對象比較小的時候傳遞指標並不划算。

建構函式

查看官方文檔,golang並沒有建構函式一說。如果一定要在初始化對象的時候進行一些工作的話,可以自行封裝產生執行個體的方法。

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

樣本:

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

繼承

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

type Poem struct {Title  stringAuthor stringintro  string}type ProsePoem struct {PoemAuthor string}

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

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

如果其中屬性有衝突,則以外圍的為主。

type ProsePoem struct {PoemAuthor 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值的稱道設計之一。詳細瞭解介面還需要一段時間,下次再分享吧。

完整的範例程式碼下載:golang物件導向範例程式碼

 

轉載請註明:快樂編程 » golang物件導向思想和實現

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.