友情提示:此篇文章大約須要閱讀 5分鐘14秒,不足之處請多指教,感謝你的閱讀。👉 訂閱本站數組
在 Go 語言中,爲便於存儲及管理用戶數據,其數據結構設計分爲數組 Array、切片 Slice、映射 Map 三種結構。數據結構
近期又看了 Go 語言基礎的內容,看了一下這三種結構實現的原理:app
一旦聲明瞭數組,其自己的數據類型及長度都是不能夠進行變動。函數
// 使用數組字面量聲明數組 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
是引用類型,它引用了其指針字段所指向的底層數組的一部分或所有;append
來實現的;切片類型有3個字段:指針
// 使用 make 建立一個切片 slice := make([]int, 3) // 建立一個具備長度和容量的切片 slice := make([]int, 1, 6) // 長度爲 1,容量爲 6 個元素
// nil 字符串切片 var slice []string // 空切片 slice := []int{} // 空的整形切片
因爲切片只是引用了底層數組,底層數組的數據並不屬於切片自己,因此一個切片只須要 24字節的內存(在 64位機器上):指針字段 8字節、長度字段 8字節、容量字段 8字節。因此在函數之間直接傳遞切片是高效的,只需分配 24字節的棧內存。code
len
函數可返還切片的長度、cap
函數可返還切片的容量。blog
映射內部使用了兩個數組:
// 建立一個映射 存儲學生信息 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); }
遍歷映射的鍵值對時的順序是隨機,若要有序的得到映射的鍵值對,則須要先遍歷出映射的鍵存到一個切片中,而後排序該切片,最後遍歷該切片,按切片中元素的順序去映射中取對應的值。