初識golang之數組,slice,map學習

數組:

定義方式:var arr [n]type,n表示數組的長度,type表示存儲元素的類型。定義好後,可使用arr[0] = 42,這樣指定下標來進行數組的讀取和賦值。 golang

注意:在go中長度也是類型的一部分,所以[3]int和[5]int是不一樣類型的。 數組

go中數組不能夠改變長度,數組之間的賦值是值的拷貝賦值,即當把一個數組做爲一個參數傳人函數的時候,傳入的實際上是數組的備份。arr := [10]int{1,2,5:6},da := [2][4]int{[4]int{1,2,3,4}, [4]int{5,6,7,8} },若是內部的元素和外部的同樣,那麼聲明能夠簡化,直接忽略內部的類型 ea := [2][4]int{{1,2,3,4},{5,6,7,8}},若是不知道數組的個數,而是按照初始化給定的值,使用 arr := [...]int{1,2,3},用三個"."點號來指定。 數據結構


slice切片:

slice就是「動態的數組」,傳值的時候他也是拷貝賦值,只是他拷貝的是內存地址,是傳遞指針的。slice老是指向一個底層的array,slice聲明也像array同樣,只是不須要長度。 app

聲明:var ys []int,slice能夠從一個數組或一個已經存在的slice中再次聲明,slice經過array[i:j]來獲取,其中i爲數組的開始位置,j爲結束位置,點不包括j,它的長度爲j-i,若是不指定i,默認從開頭開始,不指定j,則直到數組的最後一位。注意:slice的引用是內存地址,因此當改變其中的元素的值時,其餘的全部指向該slice都會改變該值。len()獲取slice的長度,cap()獲取slice的最大容量,slice的容量爲提取數組的開始位置到數組結束位置,即: 函數

arr := [10]int{1,2,3,4,5,6,7,8,9,10}
s := arr[2:5]

則len(s)爲3,而cap(s)爲8。append(s, 追加的元素),若是沒有超過slice的cap值,則會返回原來的slice引用,從而影響到引用同一個數組的其餘slice,若是超過了cap值,則會新建一個slice,並返回新slice的引用,此種狀態會跟原來的slice脫離引用關係。 google

copy()函數從源slice的src中複製元素到目標dst,並返回複製元素的個數,如: spa


sl1 := []int{10, 2, 3}
sl2 := make([]int, 10)
copy(sl2[5:8], sl1[:2])

結果爲 0,0,0,0,0,10,2,0,0,0,0 指針

map:
定義方式:map[keyType]valueType,要分別聲明鍵和值的類型,如:map[string]int,map的讀取和設置跟slice同樣,經過key進行操做,聲明可使用 article := map[string]string{"tech":"the google ....", "music":"或是展翅高飛保持憤怒...."},或者先使用make來建立內存空間,再用下標的形式來賦值,如 
article := make(map[string]string),
article["tech"] = "the google ..."
article["music"] = "誰知道咱們該去向何處..." 

注意:map是無序的,每次打印出來的map值都會不同。

來判斷map是否有相應的下標可使用:golang, ok := language["go"],經過map[key]能夠返回兩個值,一個返回相應下標下的值,一個若是指定的下標在map中不存在返回false,存在返回true。

刪除指定下標的元素,使用 delete(map, "key")。


在go語句中,只有這三種類型是拷貝內存地址的,slice,map,channel,其餘的都是拷貝賦值,len()函數一樣能夠用來獲取map中key的個數。make能夠爲這三種類型進行內存的分配,同時也只能用在這三種類型上,make初始化了內部的數據結構,填充適當的值,返回初始化後的非零值,new能夠用於各類類型的內存分配,new(TYPE)分配了零值填充的TYPE類型的內存空間,並返回其地址。即它返回的是一個內存地址*TYPE類型的值(指針)。


」零值「,並不是是空值,也不是都是0,對於integers,floats的」零值「爲0,對於布爾值的值爲false,對於字符串」零值「爲空字符串。pointers, functions, interfaces, slices, maps, channels的「零值」爲nil。不能把「零值」看成布爾false來進行判斷,如: code

var a int 內存

if a {

    fmt.Println("true")

} else {

    fmt.Println("false")

}

這樣是報錯的。

相關文章
相關標籤/搜索