Go 語言基礎 數組、切片、映射

友情提示:此篇文章大約須要閱讀 5分鐘14秒,不足之處請多指教,感謝你的閱讀。👉 訂閱本站數組

在 Go 語言中,爲便於存儲及管理用戶數據,其數據結構設計分爲數組 Array切片 Slice映射 Map 三種結構。數據結構

近期又看了 Go 語言基礎的內容,看了一下這三種結構實現的原理:app

數組 Array

  • 數組是切片和映射的基礎數據結構;
  • 數組是長度固定的數據類型而且在內存中也是連續分配的,固索引數組數據速度很是快的;
  • 聲明數組時須要指定數組存儲的類型及數量(數組的長度);
  • 數組變量的類型包括數組長度和元素的類型,只有兩部分都相同的數組纔可相互賦值。

建立及初始化

一旦聲明瞭數組,其自己的數據類型及長度都是不能夠進行變動。函數

// 使用數組字面量聲明數組
array := [5]int{1, 2, 3, 4, 5}

// 自動推導長度聲明數組
array := [...]int{1, 2, 3, 4, 5, 6}
// 使用 ... 代替長度,根據初始化元素個數推導

// 聲明數組並指定特定元素值
array := [5]int{1:10, 2:20}

指針類型

數組元素的類型能夠爲任何內置類型,也能夠是某種結構類型,也能夠是指針類型。spa

// 聲明一個元素長度爲 3 的指向字符串的指針數組
var array1 [3]*string

// 爲指針數組指定元素
*array1[0] = "demo0"
*array1[1] = "demo1"
*array1[2] = "demo2"

多維數組

數組自己是一維數據,多維數組是由多個數組組合而來的。debug

// 聲明一個二維數組
var array = [3][2]int
// 聲明瞭一個兩個維度爲 3 和 2 的元素

// 初始化二維數組
var array = [3][2]int{ {1, 2}, {3, 4}, {5, 6}}

在函數間傳遞數組:因爲在函數間傳遞變量時,傳遞的老是變量的值的副本,因此在傳遞數組變量時將拷貝整個數組!在定義函數時,對於較大的數據類型應該把參數設計爲指針類型,這樣在調用函數時,只需在棧上分配給每一個指針8字節的內存,但這意味着會改變指針指向的值(共享的內存),其實大部分狀況下應該使用切片類型,而不是數組。設計

切片 Slice

  • 切片 slice 是引用類型,它引用了其指針字段所指向的底層數組的一部分或所有;
  • 切片是圍繞動態數組的概念構建的;
  • 切片的動態增加是經過 append 來實現的;
  • 縮小則是經過對它再次切片來實現,經過再次切片得到的新切片將和原切片共享底層數組,它們的指針指向同一個底層數組。

建立及初始化

切片類型有3個字段:指針

  • 指針:指向切片所包含的第一個元素在底層數組中的地址;
  • 長度:切片所包含的底層數組的元素的個數(切片可訪問的元素的個數);
  • 容量:切片容許增加到的最大元素個數,即底層數組的長度。

make 和切片字面量

// 使用 make 建立一個切片
slice := make([]int, 3)

// 建立一個具備長度和容量的切片
slice := make([]int, 1, 6)
// 長度爲 1,容量爲 6 個元素

nil 和空切片

// nil 字符串切片
var slice []string

// 空切片
slice := []int{}
// 空的整形切片

因爲切片只是引用了底層數組,底層數組的數據並不屬於切片自己,因此一個切片只須要 24字節的內存(在 64位機器上):指針字段 8字節、長度字段 8字節、容量字段 8字節。因此在函數之間直接傳遞切片是高效的,只需分配 24字節的棧內存。code

len函數可返還切片的長度、cap函數可返還切片的容量。blog

映射 Map

  • 映射 map 是用來存儲一系列的無序鍵值對;
  • 映射是無序的集合,其實現使用了散列表;
  • 映射的散列表包含一組桶,每一個桶裏存儲着一部分鍵值對;
  • 映射內部使用了兩個數組:

    • 第一個數組:存儲着用於選擇桶的散列鍵的高八位值,該數組用於區分每一個鍵值對要存在哪一個桶裏;
    • 第二個數組:每一個桶裏都有一個字節數組,先依次存儲了該桶裏的全部鍵,以後存儲了該桶的全部值;

建立及初始化

// 建立一個映射 存儲學生信息
students := map[string]string{
    "name" : "mengxiaoyu",
    "age"  : "22",
    "sex"  : "boy",
    "hobby": "pingpang",
}

// 顯示映射全部信息
for key, value := range students{
    fmt.printf("key:%s, \t value:%s\n", key, value);
}

遍歷映射的鍵值對時的順序是隨機,若要有序的得到映射的鍵值對,則須要先遍歷出映射的鍵存到一個切片中,而後排序該切片,最後遍歷該切片,按切片中元素的順序去映射中取對應的值

讚揚

相關文章
相關標籤/搜索