Go語言為什么很少使用數(shù)組原理解析
數(shù)組介紹
在 Go 語言中,數(shù)組是一塊連續(xù)的內(nèi)存,數(shù)組不可以擴容,數(shù)組在作為參數(shù)傳遞時,屬于值傳遞。
數(shù)組的長度和類型共同決定數(shù)組的類型,不同類型的數(shù)組之間不可以比較,否則在編譯時會報錯。
因為數(shù)組的一些特性,我們在 Go 項目開發(fā)中,很少使用數(shù)組。本文我們介紹一下數(shù)組的特性。
聲明方式
在 Go 語言中,數(shù)組的聲明方式有三種。
示例代碼:
func main() { var arr1 [2]int var arr2 = [2]int{1, 2} var arr3 = [...]int{1, 2} fmt.Println(arr1) fmt.Println(arr2) fmt.Println(arr3) }
輸出結(jié)果:
[0 0]
[1 2]
[1 2]
閱讀上面這段代碼,我們使用三種方式聲明數(shù)組,其中 arr1
和 arr2
的區(qū)別是,arr1
在聲明時沒有為數(shù)組賦值,所以輸出結(jié)果是類型零值 [0 0]
。
需要注意的是,arr3
沒有指定數(shù)組的長度,而是使用 [...]
替代,這實際上是 Go 語言中聲明數(shù)組的語法糖,編譯時通過數(shù)組的賦值,自動推斷數(shù)組的長度,我們可以使用內(nèi)置函數(shù) len()
查詢數(shù)組的長度。
數(shù)組的特性
在了解嘞數(shù)組的聲明方式之后,我們再來介紹一下數(shù)組具有哪些特性。
數(shù)組的長度和類型共同決定數(shù)組的類型,例如 var arr1 [2]int
和 var arr2 [3]int
是不同的類型。并且不同類型的數(shù)組之間是不可以比較的,數(shù)組也不可以擴容。
如果數(shù)組長度小于等于 4 時,在編譯時會對數(shù)組做內(nèi)存優(yōu)化,程序啟動時在棧區(qū)初始化數(shù)組,我們在使用數(shù)組類型時,也可以注意一下這一點。
使用數(shù)組下標訪問數(shù)組中的元素時,越界訪問,在編譯時會報錯。但是,如果我們使用變量 arr[i]
作為數(shù)組下標訪問數(shù)組中的元素,在編譯時無法檢查是否越界訪問,在運行時會引發(fā) panic
。
示例代碼:
func Store() { var arr [2]int for i := 0; i < 5; i++ { arr[i] = i + 1 } fmt.Println(arr) }
輸出結(jié)果:
panic: runtime error: index out of range [2] with length 2
goroutine 1 [running]:
...
在作為參數(shù)傳遞數(shù)組類型的變量時,都屬于值傳遞,我們在使用數(shù)組類型的參數(shù)時,要特別注意。
示例代碼:
func main() { var arr2 = [2]int{1, 2} Get(arr2) fmt.Printf("arr2=%p\n%d\n", &arr2, arr2) } func Get(arr [2]int) { fmt.Printf("Get()=%p\n%d\n", &arr, arr) }
輸出結(jié)果:
Get()=0xc0000120f0
[1 2]
arr2=0xc0000120b0
[1 2]
閱讀上面這段代碼,我們可以發(fā)現(xiàn)數(shù)組在作為參數(shù)傳遞時,地址發(fā)生變化,可以證明其屬于值傳遞,即分配一塊新內(nèi)存,將數(shù)組的值拷貝到新內(nèi)存。
總結(jié)
本文我們通過介紹 Go 語言中數(shù)組的一些特性,佐證數(shù)組在 Go 項目開發(fā)中很少使用的原因。
主要原因有兩點,一是數(shù)組不可以擴容;二是值傳遞,大數(shù)組要特別小心,如果無法避免使用大數(shù)組,可以使用數(shù)組指針。
以上就是Go語言為什么很少使用數(shù)組原理解析的詳細內(nèi)容,更多關(guān)于Go語言數(shù)組使用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang兩行代碼實現(xiàn)發(fā)送釘釘機器人消息
創(chuàng)建一個釘釘機器人必須使用加簽,本文通過Golang兩行代碼實現(xiàn)發(fā)送釘釘機器人消息,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2021-12-12Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運算
這篇文章主要為大家介紹了Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Golang編程并發(fā)工具庫MapReduce使用實踐
這篇文章主要為大家介紹了Golang并發(fā)工具庫MapReduce的使用實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-04-04