Hello,你們好,我是小棧君,最近由於工做的事情延誤了一點分享的進度,可是我會盡可能抽時間分享關於IT乾貨知識,還但願你們可以持續關注「IT乾貨棧」哦。java
閒話很少說,今天給你們繼續分享關於Go語言的教程知識之結構體。程序員
在介紹結構體以前,咱們先講講編程語言中的對象的概念吧,由於在相關的程序開發過程當中,咱們一般是面向對象進行編程,就是將相關的屬性和方法組合成一個總體來看待。編程
由於對於大多數人而言,程序的編碼是一個很是抽象的東西,咱們要實現的功能須要具現化,好比說我要用程序語言描述出車的概念,那麼它必須具備相關的屬性,好比車有相關的名字,車具備長度,寬度,輪子,顏色等等。數據結構
固然車還具備相關的方法,就是能開,能停,咱們還能夠根據咱們本身的想法,營造出特別的車,好比能噴火,能上天,能變身等等,這些行爲在程序語言中就表明這一種方法。編程語言
因此千萬別小瞧程序員,在程序的語言中,咱們能夠無所不能的。這些屬性和方法的集合咱們在程序編寫中會將他們看做是一個總體,即對象。函數
咱們在面向對象編程的時候一般講了幾個要求,即抽象,繼承,封裝和多態。面向對象的方法就是利用抽象、封裝等機制,藉助於對象、類、繼承、消息傳遞等概念進行軟件系統構造的軟件開發方法。佈局
簡單的介紹完對象和麪向對象概念以後,咱們在Go語言中使用struct關鍵字表示一個對象,它主要是的格式如圖所示:編碼
咱們定一個車的結構體,它所具備的特徵就是顏色,名稱,長度,固然根據咱們的需求,他還能夠有更多的屬性,這樣的一個結構體。spa
咱們能夠看作是一個對象。它主要用於定義一個複雜的數據結構。在一個struct中咱們能夠包含許多字段(即屬性),固然在咱們定義的結構體中,咱們不只能夠定義相關的屬性,他還能夠定義相應的方法。指針
例如上圖所示,咱們定義的車,就有兩個方法,一個是跑,一個是飛。它定義的方法是和咱們函數定義的方法有全部區別的,這裏定義的方法就是咱們車這個對象獨享的。
以前定義的方法是全部知足條件的均可以使用。並且在圖片中,小棧君也明確的標註了,在go語言中不論是方法仍是對象還包括屬性都是大小寫敏感的。
大寫表示公開,至關於java中的public。小寫表示私有,至關於java中的private,並且使用指針和不使用指針,也是兩個概念,Struct中是值類型。
例如上圖中,咱們給car定義了兩個方法,一個使用指針,一個不使用指針。一樣的是改變名字。
車最原始的名字,咱們定義了一個兩米的紅色奔馳,使用changeName()方法,這個方法用的不是指針類型。
因此咱們能夠看到,車的名字在使用該方法後並無改變成保時捷,依舊是奔馳,是這個方法不生效麼?其實不是。
由於struct是值傳遞。因此當咱們不使用指針的時候,這個方法只是在該方法體內生效,出了這個方法後,是什麼樣子就是什麼樣子。
口說無憑,直接搬上例子說明。因此咱們能夠根據具體的需求,按需進行給咱們的對象進行設置方法。[奔馳,寶馬、保時捷,大家能夠給我廣告費啦~]。
固然作過編程的同窗能夠知道,咱們在其餘編程語言中有父類的概念,也就是繼承。並且在struct中是能夠進行嵌套。
因此Go語言中並無class類型,相對java,他的結構體只有struct類型,並且相比於java的繼承,struct中並無extends關鍵字。
如上圖所示,咱們就已經完成了相關的繼承。SmallCar已經完美的繼承了關於Car的屬性。
這裏也能夠看到咱們對咱們的smallCar進行賦值,其實賦值的方式有不少種,在以前的文章中有和你們聊過這個問題。除了繼承了Car的屬性以外也繼承了car的方法。
因此,在之後的項目或者實戰中,咱們能夠很好的利用這個點進行咱們基類的抽取,而後進行封裝,以達到咱們在軟件編寫中的封裝性、高內聚。
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)
}複製代碼
本文由博客一文多發平臺 OpenWrite 發佈!