数组array特点
- 长度固定
- 内存连续分配,快速计算索引,性能好
var array [5]int声明后数据类型和长度就不再改变- 如果需要对数组进行扩容,则需要创建一个更大的数组,然后把原始数组复制过去
- 声明时所有元素初始化为零值
- 数组中的值是可修改的
- 只有数组长度和数据类型都一致的两个数组才可以互相赋值
切片slice特点
-
就是动态数组
-
通过append来实现动态增长
-
通过再切片实现切片缩减
-
底层的内存也是连续分配的,所以支持索引,迭代,垃圾回收
-
切片内部实现
- 地址指针指向底层数组头部 ---- 切片的底层是数组
- 切片长度 ----- 切片能访问的元素的个数
- 切片容量 ----- 切片允许的增长的元素个数
-
slice := make([]string,5)只指定长度,切片长度和容量相等 -
slice := make([]string,3,5),切片可以访问长度内的元素,也就是前三个,如果需要访问后两个元素,则通过append函数进行扩容slice = append(slice,"abcd") -
切片长度不得小于容量
-
多个切片共享同一个底层数组,当底层数组变化是,所有切片的引用都会变化
-
slice := []int{10,20,30,40,50} newSlice := slice[1:3] newSlice[1] = 35 //此时底层的数组是 [10,20,35,40,50] //再做切片就能得到35
-
-
把数组传递给函数时,传递的时切片本身(也就是底层数组的引用),不会复制底层数组
映射map特点
- 无需的键值对,其实就是哈希表
- 由于是无序的,所有用
for k,v := range mapA的时候,不能保证返回的键值对的顺序 - 添加键值对的语句和python是一致的
map["key"] = value - 求键值对的值
value,exists := map["key"]exists为true则存在这个键值对value := map["key"],通过判断value == nil来判断是键值对是否存在
- 删除键值对,内置函数
delete(map,"key")
本文深入探讨了Go语言中数组、切片与映射(map)的特点及内部实现机制,包括数组的固定长度与连续内存分配,切片的动态增长与底层数组引用,以及映射作为哈希表的键值对存储方式。
1293

被折叠的 条评论
为什么被折叠?



