笔记 - 数组array和切片slice

  • 数组array,存储一组相同数据类型的数据结构 特点:定长
  • 切片slice, 同数组类似,也叫变长数组活动态数组 特点:变长
    特点:是一个引用类型的容器,指向了一个底层数组
  1. 每一个切片引用了一个底层数组
  2. 切片本身不存储任何数据,都是这个底层数组存储,所以修改切片也就是修个这个数组中的数据
  3. 当想切片中添加数据时,如果没有超过容量,直接添加,如果超过容量,自动扩容(成倍数增长)
  4. 切片一旦扩容,就是重新之指向一个新的底层数组
    make创建切片
    func make(t Type, size …IntegerType) Type
    第一个参数:类型
    第二个参数:长度
    第三个参数:容量cap
    slice,map,chan

切片的一些操作方法

数组和切片写法
// 1、数组写法
arr := [4]int{1,2,3,4}  // 定长
fmt.Println(arr)
// [1 2 3 4]
// 2、切片
var s1 []int  // 定义切片
fmt.Println(s1)
// []
s2 := []int{1,2, 3,4}  // 变长数组切片
fmt.Println(s2)
// [1 2 3 4]
fmt.Printf("%T, %T\n", arr, s2)
// [4]int, []int
s3 := make([]int,3,8)
fmt.Println(s3)
fmt.Printf("容量:%d, 长度:%d\n", cap(s3), len(s3))
//[0 0 0]
// 容量:8,长度:3
s3[0] = 1
s3[1] = 2
s3[2] = 3
// append()向切片末尾追加元素
s4 := make([]int,0, 5)
s4 = append(s4, 1, 2) // 改变了切片的引用地址所以得重新赋值
切片的内存分配
s1 := []int{1,2,3}
fmt.Printf("len:%d,cap:%d\n", len(s1), cap(s1)) // len:3, cap:3
fmt.Printf("%p\n", s1)  // 地址:0xc000094000
s1 = append(s1, 4, 5)
fmt.Printf("len:%d,cap:%d\n", len(s1), cap(s1)) // len:5, cap:6
fmt.Printf("%p\n", s1) // 地址:0000a4004000
s1 = append(s1, 6, 7, 8)
fmt.Printf("len:%d,cap:%d\n", len(s1), cap(s1)) // len:8, cap:12
fmt.Printf("%p\n", s1)// 地址:0000x5a004000
s1 = append(s1, 9, 10)
fmt.Printf("len:%d,cap:%d\n", len(s1), cap(s1)) // len:10, cap:12
fmt.Printf("%p\n", s1)// 未超过容量还是原来地址:0000x5a004000
s1 = append(s1, 11, 12, 13, 14, 15)
fmt.Printf("len:%d,cap:%d\n", len(s1), cap(s1)) // len:15, cap:24
fmt.Printf("%p\n", s1)// 超过,开辟新地址:0000e5a003000
在已有数组中创建切片

切片改变了,数组也相应改变
添加切片元素超过容量时,重新创建一个底层数组,重新指向一个底层数组

a := [10] int{1,2,3,4,5,6,7,8,9,10} // 数组 (定长)
s1 := a[:5] // 从1 - 5
s2 := a[3:8] // 从4 - 8
s3 := a[5:] // 从6 - 10
s4 := a[:]   // 取所有
  • 深拷贝和浅拷贝
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!