1. 程式人生 > >Go語言教程之結構體

Go語言教程之結構體

Hello,大家好,我是小棧君,最近因為工作的事情延誤了一點分享的進度,但是我會盡量抽時間分享關於IT乾貨知識,還希望大家能夠持續關注“IT乾貨棧”哦。

閒話不多說,今天給大家繼續分享關於Go語言的教程知識之結構體。

物件

在介紹結構體之前,我們先講講程式語言中的物件的概念吧,因為在相關的程式開發過程中,我們通常是面向物件進行程式設計,就是將相關的屬性和方法組合成一個整體來看待。

因為對於大多數人而言,程式的編碼是一個非常抽象的東西,我們要實現的功能需要具現化,比如說我要用程式語言描述出車的概念,那麼它必須具有相關的屬性,比如車有相關的名字,車具有長度,寬度,輪子,顏色等等。

當然車還具有相關的方法,就是能開,能停,我們還可以根據我們自己的想法,營造出特別的車,比如能噴火,能上天,能變身等等,這些行為在程式語言中就代表這一種方法。

所以千萬別小瞧程式設計師,在程式的語言中,我們可以無所不能的。這些屬性和方法的集合我們在程式編寫中會將他們看作是一個整體,即物件。

我們在面向物件程式設計的時候通常講了幾個要求,即抽象,繼承,封裝和多型。面向物件的方法就是利用抽象、封裝等機制,藉助於物件、類、繼承、訊息傳遞等概念進行軟體系統構造的軟體開發方法。

Go語言Struct

簡單的介紹完物件和麵向物件概念之後,我們在Go語言中使用struct關鍵字表示一個物件,它主要是的格式如圖所示:

我們定一個車的結構體,它所具有的特徵就是顏色,名稱,長度,當然根據我們的需求,他還可以有更多的屬性,這樣的一個結構體。

我們可以看做是一個物件。它主要用於定義一個複雜的資料結構。在一個struct中我們可以包含許多欄位(即屬性),當然在我們定義的結構體中,我們不僅可以定義相關的屬性,他還可以定義相應的方法。

例如上圖所示,我們定義的車,就有兩個方法,一個是跑,一個是飛。它定義的方法是和我們函式定義的方法有所有區別的,這裡定義的方法就是我們車這個物件獨享的。

之前定義的方法是所有滿足條件的都可以使用。而且在圖片中,小棧君也明確的標註了,在go語言中不管是方法還是物件還包括屬性都是大小寫敏感的。

大寫表示公開,相當於java中的public。小寫表示私有,相當於java中的private,而且使用指標和不使用指標,也是兩個概念,Struct中是值型別。

例如上圖中,我們給car定義了兩個方法,一個使用指標,一個不使用指標。同樣的是改變名字。

車最原始的名字,我們定義了一個兩米的紅色賓士,使用changeName()方法,這個方法用的不是指標型別。

所以我們可以看到,車的名字在使用該方法後並沒有改變成保時捷,依舊是賓士,是這個方法不生效麼?其實不是。

因為struct是值傳遞。所以當我們不使用指標的時候,這個方法只是在該方法體內生效,出了這個方法後,是什麼樣子就是什麼樣子。

口說無憑,直接搬上例子說明。所以我們可以根據具體的需求,按需進行給我們的物件進行設定方法。[賓士,寶馬、保時捷,你們可以給我廣告費啦~]。

繼承

當然做過程式設計的同學可以知道,我們在其他程式語言中有父類的概念,也就是繼承。而且在struct中是可以進行巢狀。

所以Go語言中並沒有class型別,相對java,他的結構體只有struct型別,而且相比於java的繼承,struct中並沒有extends關鍵字。

如上圖所示,我們就已經完成了相關的繼承。SmallCar已經完美的繼承了關於Car的屬性。

這裡也可以看到我們對我們的smallCar進行賦值,其實賦值的方式有很多種,在之前的文章中有和大家聊過這個問題。除了繼承了Car的屬性之外也繼承了car的方法。

所以,在以後的專案或者實戰中,我們可以很好的利用這個點進行我們基類的抽取,然後進行封裝,以達到我們在軟體編寫中的封裝性、高內聚。

Struct的記憶體佈局

Go語言中的struct型別中,它的記憶體佈局是連續性的

就按照我們之前的Car舉例子,我們定義的欄位順序,就是Go語言的記憶體佈局中的順序。

我們來進行驗證一下,看看實際的效果

其他給大家介紹一下在結構體中的欄位可以不需要定義名稱,這樣的欄位就是匿名欄位,當然一種欄位型別只允許出現一次。

否則Go語言也不能判定出,你在賦值的時候到底指定的是誰。

其實想和大家聊點題外話,因為工作的原因,小棧君創作的原創確實不太容易,主要是時間不夠,因為想分享的東西太多,對於我自身而言也是知識的歸納和總結,做程式的講究的是開源精神和分享精神。

所以小棧君為了避免長期斷更的情況下,儘量勤分享,但是可能說篇幅不會太大,一節一節分享,畢竟之前的分享基本上是兩千字或是更多,可以說是乾貨滿滿。

但是這樣的篇幅寫下來確實是精力跟不上,所以我會拆成小點,進行小記分享。以後我們就進行我們的小記分享,小棧君也盡力做到兩天一更或一天一更。

這樣大家也可以每天花3到5分鐘進行了解和提高。也非常感謝大家對小棧君的關注。你的關注就是我堅持的動力,我們明天見~拜了個拜~

package main

import "fmt"

// IT乾貨棧 定義一個結構體[大小寫敏感]
type Car struct {
  Name   string  // 名稱
  Color  string  // 顏色
  Length float32 // 長度
}

// 定義一個小車 結構
type SmallCar struct {
  Car            // 車
  Height float32 // 高度

}

func (car *Car) run() {
  fmt.Println(car.Name, "正在迅速行駛。。。。")
}

func (car *Car) fly() {
  fmt.Println(car.Name, "正在飛行。。。。")
}
func (car Car) changeName() {
  car.Name = "保時捷"
}
func (car *Car) realChangeName() {
  car.Name = "寶馬"
}

// IT乾貨棧
func main() {
  var car Car
  car.Name = "小棧"
  car.Color = "red"
  car.Length = 2.0
  fmt.Println(car)
  fmt.Printf("Name: %p\n", &car.Name)
  fmt.Printf("Color: %p\n", &car.Color)
  fmt.Printf("Length: %p\n", &car.Length)

}