學(xué)到什么
- 什么是數(shù)組?
- 如何獲取數(shù)組長(zhǎng)度蒂阱?
- 如何操作數(shù)組元素锻全?
- 如何比較兩個(gè)數(shù)組?
- 如何拷貝數(shù)組录煤?
- 如何創(chuàng)建多維數(shù)組虱痕?
- 如何省略變量(補(bǔ)充)?
概念
數(shù)組是一個(gè)長(zhǎng)度固定和元素類(lèi)型相同的集合辐赞,類(lèi)型也可以自定義。如果想保存任意類(lèi)型硝训,定義一個(gè)接口類(lèi)型數(shù)組响委。
數(shù)組每個(gè)元素的位置,稱(chēng)為索引窖梁。第一元素索引為0赘风,第二個(gè)為1,以此類(lèi)推纵刘。
聲明
聲明格式: var 數(shù)組名 [長(zhǎng)度]類(lèi)型
舉例:聲明一個(gè)長(zhǎng)度為 4邀窃,元素類(lèi)型為 int 的數(shù)組。
var nums [4]int
// 打印
[0 0 0 0]
聲明后每個(gè)元素默認(rèn)初始化為 0 假哎,如果是字符串?dāng)?shù)組瞬捕,默認(rèn)初始化為空字符串。
初始化
數(shù)組有多種初始化方式舵抹,一一列舉說(shuō)明肪虎,以下我用 :=
簡(jiǎn)寫(xiě)方式。
方式一:初始化每個(gè)元素惧蛹,如果超過(guò)數(shù)組長(zhǎng)度扇救,編譯時(shí)會(huì)提示越界錯(cuò)誤。
nums := [4]int{3, 2, 1, 4}
方式二:初始化部分元素香嗓,只有索引 0 和 1 被賦值迅腔,后面的元素默認(rèn)為 0 。
nums := [4]int{3, 2}
// 打印
[3 2 0 0]
方式三:使用 key/value 形式初始化指定索引元素靠娱,也可以和上面方式混合沧烈。
nums := [4]int{0: 3, 3: 4}
或
nums := [4]int{3, 3: 4}
// 打印
[3 0 0 4]
方式四:不指定數(shù)組長(zhǎng)度,使用 ...
讓編譯器自己決定數(shù)組的長(zhǎng)度像云。
// 數(shù)組長(zhǎng)度為 4
nums := [...]int{3, 2, 1, 4}
獲取數(shù)組的長(zhǎng)度
使用內(nèi)置的函數(shù) len
獲取數(shù)組的長(zhǎng)度掺出。
len(array)
還可以用于獲取切片徽千、map、字符串汤锨、通道的長(zhǎng)度双抽。
數(shù)組元素操作
1. 獲取元素
使用索引獲取數(shù)組的元素,后面要講的切片獲取方式也是如此闲礼。
nums := [...]int{3, 2, 1, 4}
fmt.Println(nums[1])
// 輸出
2
2. 設(shè)置元素
當(dāng)有了一個(gè)數(shù)組后牍汹,后面可以對(duì)此數(shù)組元素進(jìn)行修改。
nums := [...]int{3, 2, 1, 4}
nums[1] = 3
fmt.Println(nums)
// 輸出
[3 3 1 4]
遍歷數(shù)組
使用“for 循環(huán)語(yǔ)句”遍歷數(shù)組柬泽,上篇“流程控制”中有詳細(xì)的“for 循環(huán)語(yǔ)句”講解慎菲。
遍歷數(shù)組有兩種方式,第一種是“迭代計(jì)數(shù)”锨并,第二種“for-range”露该,使用如下:
1. 迭代計(jì)數(shù)
nums := [...]int{3, 2, 1, 4}
for i := 0; i < len(nums); i++ {
fmt.Println(nums[i])
}
2. for-range
for i, v := range nums {
fmt.Println("索引:", i, " 值", v)
}
// 輸出
索引: 0 值 3
索引: 1 值 2
索引: 2 值 1
索引: 3 值 4
數(shù)組比較
兩個(gè)數(shù)組是否相等要考慮兩方面:
- 數(shù)組必須是同一類(lèi)型,這塊指的類(lèi)型不是元素類(lèi)型第煮,而是數(shù)組長(zhǎng)度和元素類(lèi)型決定數(shù)組的類(lèi)型解幼,例如:
[2]int{1, 2}
它的類(lèi)型是[2]int
,不要誤以為是array
包警。 - 數(shù)組元素相等
a := [2]int{1, 2}
b := [2]int{1, 2}
if a == b {
print("相等")
} else {
print("相等")
}
// 輸出
相等
注:如果 b 的初始化方式為 [...]int{1, 2}
, a 和 b 依然是相等的撵摆,因?yàn)轭?lèi)型還是 [2]int
。
數(shù)組拷貝
在 Go 語(yǔ)言中害晦,數(shù)組是值類(lèi)型特铝,也就是說(shuō)在傳遞過(guò)程中會(huì)自動(dòng)拷貝一份。
nums := [...]int{3, 2, 1, 4}
numsCopy := nums
numsCopy[1] = 3
fmt.Println("nums:", nums)
fmt.Println("numsCopy:", numsCopy)
// 輸出
nums: [3 2 1 4]
numsCopy: [3 3 1 4]
多維數(shù)組
為了更好的理解多維數(shù)組壹瘟,現(xiàn)在還原一個(gè)場(chǎng)景鲫剿。
現(xiàn)在有間教室,里面有 4 行 3 列的座位稻轨,現(xiàn)在讓你記錄每個(gè)座位學(xué)生的狀態(tài)牵素,0表示曠課、1表示請(qǐng)假澄者、2表示已到場(chǎng)笆呆。
1. 聲明
先看看多維數(shù)組如何聲明。
二維數(shù)組格式:
var 數(shù)組名 [長(zhǎng)度][長(zhǎng)度]類(lèi)型
三維數(shù)組格式:
var 數(shù)組名 [長(zhǎng)度][長(zhǎng)度][長(zhǎng)度]類(lèi)型
依次類(lèi)推可以繼續(xù)聲明四維數(shù)組粱挡、五維數(shù)組等等赠幕。
繼續(xù)回到上面的場(chǎng)景,可以確定需要一個(gè) 4 行 3 列的二維數(shù)組询筏。
var students [4][3]int
3. 初始化
設(shè)置每個(gè)學(xué)生的狀態(tài)榕堰,可以看出 1 行 3 列學(xué)生曠課(值為0),3 行 2列學(xué)生請(qǐng)假(值為1)。
students := [4][3]int{
{2, 2, 0},
{2, 2, 2},
{2, 1, 2},
{2, 2, 2},
}
4. 遍歷二維數(shù)組
使用“迭代計(jì)數(shù)”方式遍歷 students
數(shù)組逆屡,輸出曠課的學(xué)生座位圾旨。
// collection/mult-array.go
for i := 0; i < 4; i++ {
for j := 0; j < 3; j++ {
if students[i][j] == 0 {
fmt.Printf("%d行%d列學(xué)生曠課", i+1, j+1)
}
}
}
// 輸出
1行3列學(xué)生曠課
省略變量
在 Go 語(yǔ)言中,使用變量有個(gè)要求:“在函數(shù)體內(nèi)魏蔗,聲明了變量就必須使用”砍的。如果不想使用,就使用“下劃線(xiàn)(_)”去省略莺治。
舉兩個(gè)例子廓鞠,省略函數(shù)返回的 b 變量和數(shù)組循環(huán)的索引 i 。
a, b := fun1()
for i, v := range array {
...
}
// 省略后
a, _ := fun1()
for _, v := range array {
...
}
總結(jié)
本篇講解了 Go 語(yǔ)言?xún)?nèi)置集合中的數(shù)組谣旁,還有對(duì)省略變量知識(shí)點(diǎn)的補(bǔ)充床佳,因?yàn)樘S昧恕O缕獙⒅v解切片榄审,它和數(shù)組關(guān)系密切砌们,所以本篇一定要掌握明白。如果遇到什么問(wèn)題搁进,就在下方留言浪感!