Go語言基礎:array、slice、make和new操作、map

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

array

數組聲明和賦值

go的數組聲明跟C語言很相似,除了數群組類型放在變數名後面【這點跟變數的聲明一樣】。
數組的定義格式:

//一維數組var 數組名[n] 數群組類型 //需要注意的是:'[n]'可以寫成'[...]',go會自動根據元素個數來計算長度,//我猜應該是編譯的時候計算的吧
//二維數組var 數組名[2][n]int{[n]數群組類型{..},[n]數群組類型{}}

數組的聲明和賦值:

//一維數組var ar = [5]byte {'a', 'b', 'c', 'd', 'e'}//也可以ar := [5]byte {'a', 'b', 'c', 'd', 'e'}//注意這個只能是函數內部定義,也就是局部變數//二維數組var arr = [2][4]int{ [4]int{1, 2, 3}, [4]int{4, 5, 6} }//可以省略{}中的[4]intvar arr = [2][4]int{ {1, 2, 3}, {4, 5, 6} }

數組容量和長度

Go中,函數cap()len()均輸出數組的容量跟長度,不難發現數組的容量跟長度是一樣的。

slice

Go的數組用的是C的思想,那麼slice則用的是java的思想。slice在記憶體中的本質其實也是數組,體現為連續的記憶體塊。但是它與數組又有不同,數組一旦定義好了,它的大小也就固定了;而slice的大小是可以變化的,但又不是java中真正意義上的動態數組,而是數組的引用,是一個參考型別。
slice的聲明跟數組的聲明一樣,只是不需要長度。
slice的聲明:

var fslice []int//注意這裡沒有長度,所以不要把它認為是數組哦//同樣也可以slice := []int{1,2,3}

sliced的聲明和賦值:

var ar = []byte {'a', 'b', 'c', 'd', 'e'}//也可以ar := []byte {'a', 'b', 'c', 'd', 'e'}//注意這個只能是函數內部定義,也就是局部變數

我們也可以從一個數組或者一個已經存在的slice中再次聲明。slice 通過 array[i:j] 來擷取,其中 i是數組的開始位置, j 是結束位置,但不包含 array[j] ,它的長度是 j-i

//聲明一個數組var Array_ori = [11]byte {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'}//聲明兩個slicevar Slice_a,Slice_b[]byte//Slice_a指向數組Array_ori,第2個元素`Array_ori[2-1]`開始,第5個元素`Array_ori[5-1]`結束slice_a = Array_ori[2:5]//slice1指向數組Slice_a,第3個元素`Slice_a[3-1]`開始,第5個元素`Slice_a[5-1]`結束slice_b = Slice_a[3:5]//先自己想下會輸出什麼

其資料結構如下所示:

根據,不難推匯出Array_ori, slice_a, slice_b的內容輸出如下:

Array_ori:[a b c d e f g h i j k]slice_a:[c d e]slice_b:[f g]

是不是對slice有種似曾相識的感覺,沒錯,感覺跟C的指標很像,一開始學的時候感覺有java的動態數組的思想,這會又有C的指標思想,寶寶好淩亂啊。

slice的幾個內建函數

  • cap():slice的最大容量,上例中的 Slice_a和Slice_b的cap()值分別為8和5。正式由於Slice_a容量為8,所以給Slice_b的賦值是有效
  • len():slice的長度,上例已有介紹,Slice_a和Slice_b的len()值分別為3和2
  • append():向 slice 裡面追加一個或者多個元素,然後返回一個和 slice 一樣類型的slice
  • copy():函數 copy 從源 slice 的 src 中複製元素到目標 dst ,並且返回複製的元素的個數

make和new操作

make跟new都可以用於記憶體配置。

  • new用於各種類型的記憶體配置,本質上跟java的new的功能是一樣的。new(T)返回了一個指標,指向新分配的類型 T 的零值。
  • make只能用於給slice、map和channel類型的記憶體配置,並且返回一個有初始值(非零)的 T 類型,而不是指標 T。

map

map跟Pythoon的字典概念一樣,淩亂了,又開始有python的思想了。關鍵是不懂python啊,不過沒關係,後面我會學它的。

map的格式:

map[keyType] valueType

map的聲明:

  • 使用map關鍵字: var map_variable map[keyType]valueType
  • 使用 make 函數,返回一個 map 給 map_variable:map_variable = make(map[keyType]valueType)

map的聲明和賦值

var numbers map[string] int// 另一種 map 的聲明方式numbers := make(map[string]int)numbers["one"] = 1 //賦值 key是“one”,值是1numbers["ten"] = 10 //賦值numbers["three"] = 3fmt.Println("第三個數字是: ", numbers["three"]) // 讀取資料列印出來如:第三個數字是: 3

map注意事項:

  • map 是無序的,每次列印出來的 map 都會不一樣,它不能通過 index 擷取,而必須通過 key 擷取
  • map 的長度是不固定的,也就是和 slice 一樣,也是一種參考型別
  • 內建的 len 函數同樣適用於 map ,返回 map 擁有的 key 的數量
  • map 的值可以很方便的修改,通過 numbers[“one”]=11 可以很容易的把 key 為 one的字典值改為 11
  • map 的初始化可以通過 key:val 的方式初始化值,同時 map 內建有判斷是否存在 key 的方式;比如:map_variable := map[string]string{"a": "1", "b": "2", "c": "3"}
  • 通過 delete 刪除 map 的元素,函數原型delete(map_variable, key)

聯繫我們

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