擼起袖子加油干 golang入坑系列


還是提醒一下,里面有段子,不都是技術。 沖着技術來的,慢走不送。沒有版權,但可以給我發郵件(ztao8607@gmail.com)

在我的發小朋友中,終於最后一位打光棍的要結婚了。 說實話,真心不容易。相親七八次,女方年齡上至32,下至23。跨度之大,范圍之廣,在我的發小界相當罕見。 捫心自問,程序員都怎么了?為什么找個女朋友結婚會如此艱難。 是coder們不解風情?還是被島國妹子蒙蔽了心靈?若說木訥,內向。那恐怕是對碼農們最大的誤解了,在他們一副不願說話的面具之下都暗藏着一顆洶涌澎湃的內心,時時刻刻在迸發着靈感。但至於這份靈感幾分用於妹子身上,那就尚未可知了。也見過舌尖口利,口若懸河的屌絲,但這種狀態經常出現在與人爭論技術問題之時,如若對面站的是一個萌妹子,恐怕再多的hello world也要return回肚子里面。所以,我這位發小找不到另一半,的確是有原因的。 還好,經過全方位不歇的努力,終於找到了一個懂得撬開這位愣頭青口舌的妹子。所以,借此祝願二位喜結良緣,白頭到老,擼起袖子加油干!

書接上文,繼續來聊Golang中常見的數據類型。

在上篇中,說到了String。本節來看數組Array。若你還有印象,想必在大學課堂之上肯定會有一門<數據結構>的課程。這門課程應該是計算機專業的奠基之課,學好了這門課,即便你不會寫代碼也不耽誤你找份好工作。如果又學好了算法,即便你不會寫代碼,也不耽誤你去BAT實習。

而數組就是一種常見的數據結構。 這里沒法從數據結構的角度來講數組,因為我自認對此並不精通,講不好不如不講。 有興趣,建議翻看大學數據結構的教材,看懂那本就夠了。

Golang的數組從數據結構的角度來說,和其它語言沒什么區別。都是鏈式存儲數據,存儲相同類型的數據。數組下標同樣從0開始計數,通過[]來順序訪問。例如:

intList[0] intList[1] ... intList[99]

聲明數組最常用的方法是下面這種:

var arrayname[SIZE] type

這是最常用的單維數組(只有一個維度的數組),相對應的會存在多維數組,例如二維數組。二維數組的每一項都是另外一個數組,因此可以理解成存放數組的數組。

當使用上面語句聲明變量時,Size必須是一個大於零的整數常量,而類型可以是任何合法的數據類型(包括內置的基本類型或者自定義的數據類型)。

例如,我們聲明一個長度為10的整型數組:

var intList[10] int

在<准備沖鋒>一節中,可以看到變量聲明之外,如果是基本數據類型的變量,golang會自動完成初始化。 那數組呢?golang會不會自動完成初始化。你可以自己動手寫段代碼試一下。如果不想寫,直接拿走下面的代碼:

package main

import (
    "fmt"
)

func main() {
    var intList [10]int
    fmt.Println(intList[1])
    fmt.Println(intList[9])
}

任意訪問兩個元素,結果都是0. 換成其它類型,看看結果。實際結果表明,如果是基本數據類型,golang同樣會對數組元素進行初始化。在上例當中,所有元素都初始化成了0. 如果想初始化其它數據怎么辦?Easy,使用下面的語法:

var name = [SIZE]type{ value, value .... }

從語法上面來看,就是一個二合一。 首先聲明數組,然后對數組中每個元素進行賦值,借此完成數據初始化的目的。比如下面:

var intList = [5]int{1,2,3,4,5}

在運行一下代碼,看看結果:

package main

import (
    "fmt"
)

func main() {
    var intList = [5]int{1,2,3,4,5}
    fmt.Println(intList[1])
    fmt.Println(intList[4])
}

這種方式是常用的初始化方式,再說一點不太常用,但面試的時候容易被人提及的(正常情況下,使用概率低於10%).

隱式長度

var intList = []int{1,3,4,5,6}

事先不聲明長度,依靠后面初始值的長度來確定數組長度,沒啥可說的,技巧而已。

比這個剛常用的是:

var intList []int
intList = append(intList,10)

但此時intList已經變成切片類型了。 切片和數組還是有所不同的,在下節會講到切片類型,這里只劇透一下。

數組初始化完成之后,在后面的程序中都可以直接使用了。 而使用的方式,就是通過下標依次取出進行賦值或者取值操作。例如:

// 直接拷貝個源代碼,用來說明問題
package main

import "fmt"

func main() {
   var n [10]int
   var i,j int

   for i = 0; i < 10; i++ {
      n[i] = i + 100 
   }

   for j = 0; j < 10; j++ {
      fmt.Printf("Element[%d] = %d\n", j, n[j] )
   }
}

Golang最基本的數組用法就是這些,在開始的時候說過,最常用的是一維數組,多維數組使用不算太多(尤其超過二維的數組,用之甚少),因此使用一點篇幅來說一下多維數組的使用。

首先是多維數組的聲明,看着負責,其實不難:

var name [SIZE1][SIZE2][SIZE3]....type

既然是數組,就要遵循數組的規范,無論是多維數組還是單維數組,其中的元素必須是同一種數據類型,所以可以看到最后只有一種type。

而上面多個SIZE的個數表示的是維度,上面有三個SIZE表示的是三維(例如經常說的長高寬,如果你非要理解成那個三維,隨便你,也沒錯)。如果只有[SIZE1][SIZE2]就表示是二維。

多維數組的初始化和一維一樣(其實我們可以將多維數組降維成一維),看下面:

var a = [3][4]int{  
   {0, 1, 2, 3} ,   
   {4, 5, 6, 7} ,   
   {8, 9, 10, 11}   
}

a是一個二維數組,在第一維上面有三個元素,每個元素是一個數組(這個數組是一個保存四個元素的單維數組)。所以這個數組的初始化,就是同時完成多個數組的初始化。

多維數組的訪問,仍然遵循下標訪問的規則。 例如需要取出上面數組中的8,那就是 a[2][0]。 因為8所在的數組是a數組的第三個元素,所以先取出a[2],而這個a[2]是一個數組,8是這個數組的第一個元素,所以a[2][0]就是8。

熟能生巧,唯手熟爾。 所以遇到不明白的地方,多寫幾段代碼看看效果。

最后問個小問題,讓你來回答。

提問:[5]int 和 []int 是不是同一種數據類型

回答: XXXX

還是那句話,寫段代碼驗證一下。

package main

import "fmt"

func main() {
    var s []int
    s = append(s, 10)
    printArray(s)
}

func printArray(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}

如果把printArray的參數由[]int 替換成 [5]int,看看什么效果。 恩,報錯。 會提示你類型不一致。這點是剛開始寫golang代碼時容易混淆的地方,[5]int是數組類型,而[]int則是切片類型。因此會報錯。

在實際編程經驗中,數組使用率反而不如切片高。這又是為何呢? 還不點個star,訂閱下一節。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM