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

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

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

注意:在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一樣,只是不需要長度。

聲明: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脫離參考關聯性。

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


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來進行判斷,如:

var a int

if a {

    fmt.Println("true")

} else {

    fmt.Println("false")

}

這樣是報錯的。

 

 

 




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.