内建容器(数据结构)
一、数组
-
数组的定义:
数量写在类型的前面
var array1 [5]int array2 := [3]int{1, 2, 3} array3 := [...]int{2, 4, 5, 6, 6} //...符号不能省略,否则等于定义了切片 var grid [4][5]bool //四个长度为5的bool数组
-
数组在传递参数时是值传递,因此函数中对数组做修改不影响原数组。
-
[10]int 和 [20]int 是不同类型,值是数组类型的一部分
-
调用func f(arr [10]int) 会拷贝数组
-
在go语言中一般不直接使用数组
二、切片Slice
slice内部是对数组的一个视图。
slice的扩展
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8}
s1 := arr[2:6]
s2 := s1[3:5]
- s1的值为[2, 3, 4, 5], s2的值为 [5, 6]
- slice的值可以向后扩展,不可以向前扩展
- s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
向slice添加元素
- 添加元素时如果超越cap,系统会重新分配更大的底层数组
- 由于扩展时是值传递的关系,扩展后的结果放在append的返回值
- s = append(s, val)
三、Map的学习
go语言中map的标准定义示例:
m := map[string]string {
"name": "ccmouse",
"course": "golang",
"site": "imooc",
"quality": "notbad",
}
在map中,值类型可以为另一个map,即值类型可以嵌套。
map[K]V, map[K1]map[K2]V
3.1 map的基础使用
-
创建用make
m := make(map[string]string)
-
获取元素
name := m[string]
-
删除键值直接用delete函数
delete(m, "name")
-
当获取key所对应的value时,如果值不存在,则返回value类型的初始值,不会报错,可以用下面的方法判断key是否存在于map中。
name, ok := m["name"] //ok的类型为bool型
3.2 map中key的类型限制
- map底层逻辑是使用哈希表,必须可以比较相等。
- 除了slice,map,function的内建类型都可以作为key
- Struct类型不包括上述字段,也可以作为key。