Go基础系列:7. 内置集合 - 数组

学到什么

  1. 什么是数组?
  2. 如何获取数组长度?
  3. 如何操作数组元素?
  4. 如何比较两个数组?
  5. 如何拷贝数组?
  6. 如何创建多维数组?
  7. 如何省略变量(补充)?

概念

数组是一个长度固定和元素类型相同的集合,类型也可以自定义。如果想保存任意类型,定义一个接口类型数组。

数组每个元素的位置,称为索引。第一元素索引为0,第二个为1,以此类推。

声明

声明格式: var 数组名 [长度]类型

举例:声明一个长度为 4,元素类型为 int 的数组。

var nums [4]int

// 打印
[0 0 0 0]

声明后每个元素默认初始化为 0 ,如果是字符串数组,默认初始化为空字符串。

初始化

数组有多种初始化方式,一一列举说明,以下我用 := 简写方式。

方式一:初始化每个元素,如果超过数组长度,编译时会提示越界错误。

nums := [4]int{3, 2, 1, 4}

方式二:初始化部分元素,只有索引 0 和 1 被赋值,后面的元素默认为 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]

方式四:不指定数组长度,使用 ... 让编译器自己决定数组的长度。

// 数组长度为 4
nums := [...]int{3, 2, 1, 4}

获取数组的长度

使用内置的函数 len 获取数组的长度。

len(array)

还可以用于获取切片、map、字符串、通道的长度。

数组元素操作

1. 获取元素

使用索引获取数组的元素,后面要讲的切片获取方式也是如此。

nums := [...]int{3, 2, 1, 4}
fmt.Println(nums[1])

// 输出
2

2. 设置元素

当有了一个数组后,后面可以对此数组元素进行修改。

nums := [...]int{3, 2, 1, 4}
nums[1] = 3
fmt.Println(nums)

// 输出
[3 3 1 4]

遍历数组

使用“for 循环语句”遍历数组,上篇“流程控制”中有详细的“for 循环语句”讲解。

遍历数组有两种方式,第一种是“迭代计数”,第二种“for-range”,使用如下:

1. 迭代计数

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

数组比较

两个数组是否相等要考虑两方面:

  • 数组必须是同一类型,这块指的类型不是元素类型,而是数组长度和元素类型决定数组的类型,例如: [2]int{1, 2} 它的类型是 [2]int ,不要误以为是 array 。
  • 数组元素相等
a := [2]int{1, 2}
b := [2]int{1, 2}
if a == b {
    print("相等")
} else {
    print("相等")
}

// 输出
相等

注:如果 b 的初始化方式为 [...]int{1, 2} , a 和 b 依然是相等的,因为类型还是 [2]int 。

数组拷贝

在 Go 语言中,数组是值类型,也就是说在传递过程中会自动拷贝一份。

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]

多维数组

为了更好的理解多维数组,现在还原一个场景。

现在有间教室,里面有 4 行 3 列的座位,现在让你记录每个座位学生的状态,0表示旷课、1表示请假、2表示已到场。

1. 声明

先看看多维数组如何声明。

二维数组格式:

var 数组名 [长度][长度]类型 

三维数组格式:

var 数组名 [长度][长度][长度]类型 

依次类推可以继续声明四维数组、五维数组等等。

继续回到上面的场景,可以确定需要一个 4 行 3 列的二维数组。

var students [4][3]int

3. 初始化

设置每个学生的状态,可以看出 1 行 3 列学生旷课(值为0),3 行 2列学生请假(值为1)。

students := [4][3]int{
    {2, 2, 0},
    {2, 2, 2},
    {2, 1, 2},
    {2, 2, 2},
}

4. 遍历二维数组

使用“迭代计数”方式遍历 students 数组,输出旷课的学生座位。

// 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列学生旷课", i+1, j+1)
        }
    }
}

// 输出
1行3列学生旷课

省略变量

在 Go 语言中,使用变量有个要求:“在函数体内,声明了变量就必须使用”。如果不想使用,就使用“下划线(_)”去省略。

举两个例子,省略函数返回的 b 变量和数组循环的索引 i 。

a, b := fun1()

for i, v := range array {
    ...
}

// 省略后
a, _ := fun1()
for _, v := range array {
    ...
} 

总结

本篇讲解了 Go 语言内置集合中的数组,还有对省略变量知识点的补充,因为太常用了。下篇将讲解切片,它和数组关系密切,所以本篇一定要掌握明白。如果遇到什么问题,就在下方留言!

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容