數組一個固定長度的特定類型元素組成的序列,一個數組可以由零個或多個元素組成。因為數組的長度是固定的,所以在Go語言中很少直接使用數組。
和數組對應的類型是Slice(切片),Slice是可以增長或收縮的動態序列,功能也更靈活。但是想要理解slice工作原理的話需要先理解數組。所以本節主要為大家講解數組的使用。
## Go語言數組的聲明
數組的聲明語法如下:
~~~
var 數組變量名 [元素數量]Type
~~~
語法說明如下所示:
* 數組變量名:數組聲明及使用時的變量名;
* 元素數量:數組的元素數量,可以是一個表達式,但最終通過編譯期計算的結果必須是整型數值,元素數量不能含有到運行時才能確認大小的數值;
* Type:可以是任意基本類型,包括數組本身,類型為數組本身時,可以實現多維數組;
數組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從 0 開始到數組長度減 1 的位置,內置函數?len() 可以返回數組中元素的個數。
默認情況下,數組的每個元素都會被初始化為元素類型對應的零值,對于數字類型來說就是 0,同時也可以使用數組字面值語法,用一組值來初始化數組:
~~~
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
~~~
在數組的定義中,如果在數組長度的位置出現“...”省略號,則表示數組的長度是根據初始化值的個數來計算,因此,上面數組?q 的定義可以簡化為:
~~~
q := [...]int{1, 2, 3}
fmt.Printf("%T\n", q) // "[3]int"
~~~
數組的長度是數組類型的一個組成部分,因此 \[3\]int 和 \[4\]int 是兩種不同的數組類型,數組的長度必須是常量表達式,因為數組的長度需要在編譯階段確定。
~~~
q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // 編譯錯誤:無法將 [4]int 賦給 [3]int
~~~
## 比較兩個數組是否相等
如果兩個數組類型相同(包括數組的長度,數組中元素的類型)的情況下,我們可以直接通過較運算符(`==`和`!=`)來判斷兩個數組是否相等,只有當兩個數組的所有元素都是相等的時候數組才是相等的,不能比較兩個類型不同的數組,否則程序將無法完成編譯。
~~~
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 編譯錯誤:無法比較 [2]int == [3]int
~~~
## 遍歷數組——訪問每一個數組元素
遍歷數組也和遍歷切片類似,代碼如下所示:
~~~
var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"
for k, v := range team {
fmt.Println(k, v)
}
~~~
代碼輸出結果:
~~~
0 hammer
1 soldier
2 mum
~~~
## 多維數組
Go語言中允許使用多維數組,因為數組屬于值類型,所以多維數組的所有維度都會在創建時自動初始化零值,多維數組尤其適合管理具有父子關系或者與坐標系相關聯的數據。
聲明多維數組的語法如下所示:
~~~
var array_name [size1][size2]...[sizen] array_type
~~~
其中,array\_name 為數組的名字,array\_type 為數組的類型,size1、size2 等等為數組每一維度的長度。
結合上一節《Go語言數組》中所學到的知識,下面以二維數組為例來簡單講解一下多維數組的使用。
二維數組是最簡單的多維數組,二維數組本質上是由多個一維數組組成的。
- 1.Go語言前景
- 2.Go語言環境搭建
- 3.Go語言的基本語法
- 3.1變量
- 3.1.1變量聲明
- 3.1.2變量初始化
- 3.1.3多個變量同時賦值
- 3.1.4匿名變量
- 3.1.5變量的作用域
- 3.1.6整型
- 3.1.7浮點類型
- 3.1.8復數
- 3.1.9bool類型
- 3.1.10字符串
- 3.1.11字符類型
- 3.1.12類型轉換
- 3.2常量
- 3.1.1const關鍵字
- 3.2.2模擬枚舉
- 4.Go語言的流程控制
- 4.2循環結構
- 4.3鍵值循環
- 4.4switch語句
- 4.5goto語句
- 4.6break語句
- 4.7continue語句
- 5.Go語言的函數
- 5.1函數聲明
- 5.2函數變量
- 5.3函數類型實現接口
- 5.4閉包
- 5.5可變參數
- 5.6defer(延遲執行語句)
- 5.7處理運行時錯誤
- 5.8宕機(panic)
- 5.9宕機恢復(recover)
- 5.10Test功能測試函數
- 6.Go語言的內置容器
- 6.1數組
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go語言的結構體
- 8.Go語言的接口
- 9.Go語言的常用內置包
- 10.Go語言的并發
- 11.Go語言的文件I/O操作
- 12.Go語言的網絡編程
- 13.Go語言的反射
- 14.Go語言的數據庫編程
- 15.Go語言密碼學算法
- 16.Go語言的gin框架
- 17.Go語言的網絡爬蟲
- 18.Go語言的編譯和工具鏈