数组
5 分钟阅读
说明
以下实例代码中:
verbs
的定义是:var verbs = []string{"T", "v", "#v"}
mfp
来自:"github.com/before80/utils/mfp"
C创建
一维数组
1 直接创建
|
|
a0: %T -> [3]int | %v -> [0 0 0] | %#v -> [3]int{0, 0, 0}
a1: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
a2: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
a3: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
ad1: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
2 是否可以通过make创建?
=> 不可以
|
|
3 是否可以通过new创建?
=> 可以
|
|
多维数组
从一维数组的创建中可以推测出,多维数组的创建也是不能通过make进行创建,new可以进行创建。
|
|
U修改
1 修改元素
|
|
一维数组
a14: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
a14: %T -> [3]int | %v -> [11 2 3] | %#v -> [3]int{11, 2, 3}
a14: %T -> [3]int | %v -> [11 2 33] | %#v -> [3]int{11, 2, 33}
a14: %T -> [3]int | %v -> [111 2 33] | %#v -> [3]int{111, 2, 33}
二维数组
a15: %T -> [2][2]int | %v -> [[11 2] [3 4]] | %#v -> [2][2]int{[2]int{11, 2}, [2]int{3, 4}}
a15: %T -> [2][2]int | %v -> [[11 2] [33 4]] | %#v -> [2][2]int{[2]int{11, 2}, [2]int{33, 4}}
a15: %T -> [2][2]int | %v -> [[111 2] [33 4]] | %#v -> [2][2]int{[2]int{111, 2}, [2]int{33, 4}}
三维数组和二维数组类似
2 用整个数组赋值
|
|
a16: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
赋值后 a16: %T -> [3]int | %v -> [2 3 4] | %#v -> [3]int{2, 3, 4}
可以看出,整个数组赋值时,新旧两个数组的元素个数(长度)和数组元素类型一定要都一致,否则将报错。
A访问
访问数组中的某一元素,可通过索引下标,索引下标范围[0, len(数组名) - 1]
,即从0开始到数组的长度减去1。
1 直接访问指定索引下标的元素
|
|
1
2
3
2 遍历数组
通过遍历的方式访问所需索引下标或全部索引下标的元素:
|
|
0 -> 1
2 -> 3
------------------
0 -> 1
1 -> 2
2 -> 3
3 获取相关数组属性
|
|
a22数组的长度 len(a22)= 3
a22数组的容量 cap(a22)= 3
我们会发现任何数组的长度和容量是相等的。
D删除
1 是否可以删除某一元素呢?
=> 不可以
通过上面的创建、修改、访问,我们知道数组有两个重要的属性:长度和元素类型。假设真能删除某一元素,那么新旧数组的长度就不一样了,这样就导致了前后两个数组不一致,故Go语言的设计中也没有提供删除数组元素的操作。
作为实参传递给函数或方法
因数组在Go语言中是值类型
,数组作为实参传递给函数,将发生完整复制数组,若数组很大,对于内存和性能将会是一个大开销。
易混淆的知识点
1 数组指针和指针数组
|
|
数组指针
ptrA181: %T -> *[3]int | %v -> &[1 2 3] | %#v -> &[3]int{1, 2, 3}
*ptrA181: %T -> [3]int | %v -> [1 2 3] | %#v -> [3]int{1, 2, 3}
------------------
指针数组
a20: %T -> [3]*int | %v -> [0xc000012340 0xc000012348 0xc000012350] | %#v -> [3]*int{(*int)(0xc000012340), (*int)(0xc000012348), (*int)(0xc000012350)}
0 -> 1
1 -> 2
2 -> 3
易错点
1 访问最后一个数组元素
直接用a[len(a)]
访问数组a的最后一个元素 => 肯定报错
|
|
3
数组的特点
数组中的元素在内存中的存储是连续的,故检索数组非常快,但定义后数组的大小不能再修改。