05-集合数据类型(复杂数据类型)
05-集合数据类型(复杂数据类型)
什么是集合数据类型
在 Go 语言里,集合数据类型指的是可以存储多个元素、支持批量操作的数据类型,核心作用是存放一组数据,而不是单个值。
例如:
-
数组
-
切片(slice)
-
map
-
list
数组
1、定义
例如:[3]string和[4]string是不同的数据类型
[]string不是数组,而是切片
**2、**数组的初始化
- 全部初始化
- 部分初始化
可以只初始化某个下标的,其他默认为空
- 不指定数组元素的个数(动态)
使用[...]
3、比较
这个和js不同,不存在引用地址不同,就不相等。这个只要元素的对应下标的内容一致,就是相等的
4、多维数组
切片
1、定义
go中的切片slice就和js的数组效果是一样的。就是一个动态的go数组,底层也是使用的数组
2、赋值
- 使用append追加
- 定义时赋值
- make 函数初始化(最常用)
通过make([]类型, 长度, 容量)完成
- 从数组或切片中截取
共享底层数组,修改会互相影响
3、访问切片元素
可以通过下标访问,也可以传递start:end的方式
4、通过...添加多个切片元素
这个用法和js的扩展运算符类似
5、元素的删除
6、复制slice
方式1:
方式2:使用全局函数copy
方式1和方式2的区别:
7、slice底层原理
go的slice在函数参数传递的时候是值传递还是引用传递?
- 值传递,但是效果又呈现引用传递
现象:
因为在对slice操作的时候,底层指针指向的都是同一个数组的地址,当容量足够的时候,影响的是原数组,当容量不够,例如使用append进行增加的时候,这时候数组就会扩容(会*2倍增加,例如当前8个空间满了,就会申请一个16个的新空间),会新开辟一块内存空间,可以理解为此时是两个数组了。
此时的元素改变,就不会影响原来的切片值了。
这个*2倍扩容,也不是一直遵循,因为是2GB的容量,*2的话会浪费性能,后续的扩容会变得缓慢。
也就是说在没扩容前,slice是共享的,但是扩容后,slice就会新复制一份,此时就不共享了
Map
map是key、value的无序的集合
1、定义、赋值、取值
2、初始化
map必须要初始化,不然会报错:

因为不能在nil的map去放值,所以必须初始化:
3、遍历
map是无序的,打印顺序可能会变
4、判断是否为空
上面的代码写起来会很麻烦,下面是简写:
5、注意
map并不是线程安全的,在并发场景下,需要使用sync包裹
List(链表)
1、定义、插值
- 定义:
- 插值:
2、遍历打印值
节点类型:*list.Element
-
l.Front()→ 首节点 -
l.Back()→ 尾节点 -
l.Next():获取下一个节点,到末尾返回nil -
l.Prev():获取上一个节点,到头部返回nil -
i.Value:获取当前节点的值