Golang的数组、切片、映射的理解
1、數組
????????go的數組是值類型,賦值和傳參操作都會復制整個數組數據,因此一般使用指針在函數間傳遞大數組。
????????如果數組長度不確定,可以使用 ... 代替數組的長度,編譯器會根據元素個數自行推斷數組的長度:balance := [...]float32{},同時還可以通過指定下標來初始化元素。
2、切片
????????引用類型,創建的變量被稱作標頭( header)值,標頭值里包含一個指針,指向底層數據結構,因此通過復制傳遞一個引用類型的值的副本時(go語言中所有都是值傳遞),本質上是傳遞指針,還是共享底層的數據結構。
????????Go 中切片其實可以看作是對數組的抽象,Go中數組的長度不可改變,Go中提供了一種功能強悍的切片("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。切片不需要說明長度,[] 表示是切片類型。
????????切片由3個字段組成:指向底層數組首地址的指針、切片的長度、切片的容量(即允許增長到的元素個數也是底層數組的長度)。
// 使用make 創建空的整型切片 slice := make([]int, 0) // 使用切片字面量創建空的整型切片,初始的長度和容量會基于初始化時提供的元素的個數確定。 slice := []int{}2.1、append擴容:append 會首先使用可用容量(長度小于容量的部分),沒有可用容量了才會分配一個新的底層數組即一個包含修改結果的新切片。又因為切片賦值或截取的切片會共享同一個底層數組,對切片進行修改后,就很可能會導致不同的結果(原先賦值的變量或截取的切片還是指向之前的地層結構,而擴容后指向了新的底層數組,導致不一致),因此建議設置切片長度和容量相等,這樣每次append都會返回一個新的切片。
返回的新切片按以下規則進行擴容:在切片的容量小于1000 個元素時,總是會成倍地增加容量。一旦元素個數超過1000,容量的增長因子會設為1.25,也就是會每次增加25%的容量。
3、映射
引用類型,創建的變量被稱作標頭( header)值,標頭值里包含一個指針,指向底層數據結構,因此通過復制傳遞一個引用類型的值的副本時,本質上是傳遞指針,還是共享底層的數據結構。
dict := make(map[string]int) dict := map[string]int{}映射底層使用兩個數據結構來存儲數據。
第一個數據結構是一個數組,數組存儲的是鍵的散列值的高八位值,用于選擇鍵值對存儲在哪個對應的桶。
第二個數據結構是一個字節數組(對應一個邏輯上的桶),用于存儲整個鍵值對,該字節數組先依次存儲了這個桶里所有的鍵,之后依次存儲了這個桶里所有的值,目的在于減少每個桶所需的內存。
映射的鍵可以是任何值。這個值的類型可以是內置的類型,也可以是結構類型,只要這個值可以使用==運算符做比較。但是切片、映射、函數以及包含切片的結構類型這些類型由于具有引用語義,不能作為映射的鍵。
在golang中,通過鍵來索引映射時,即便這個鍵不存在也總會返回一個值。在這種情況下,返回的是該值對應的類型的零值。
總結
以上是生活随笔為你收集整理的Golang的数组、切片、映射的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求你了,别再说Java对象都是在堆内存上
- 下一篇: 推荐几个来自北大、南开的大神的公众号!