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