全栈编程

Balance $ 2,317
Item Sold 1230
文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!

知识大纲 【全栈编程go语言体系课】切片知识大纲,版权@luboke.com,受法律保护。

切片

一、切片概述(切片是什么)

1.一种数据结构,便于使用与管理我们的数据集合。
2.按需自动增长,动态数组(通过append来完成)
3.底层指向的是数组
4.内存当中是连续的存储空间,可以有效的提升cpu的执行效率。
5.引用类型

二、切片组成

指向底层数组的指针
切片元素的长度,通过len()获取
容量,通过cap()获取

三、切片的作用与应用场景

作用
在函数当中传递切片时,当数据类型数据较大时,使用切片可以有效减少内存占用,提高程序执行效率

应用场景
从数据库表中读取商品信息时,用到map切片,每一个map看成一个整体

四、切片的定义(怎么用)

1.1. 定义一个数组,让切片去引用,这种方式,数组可见

arrayVariables := [...]int{12, 21, 23, 55, 98, 2}

//定义一个切片去引用数组,这种情况默认长度和容量一致
var sliceVariables []int
sliceVariables = arrayVariables[:]

通过以上代码,分析切片的底层情况

分别打印数组的地址与切片的地址来分析。

//切片的定义
var sliceVariables []int
//定义一个数组
arrayVariables := [...]int{12,21,23,55,98,2}
for i :=0;i<len(arrayVariables);i++ {
   fmt.Printf("arrayVariables[%d]=%d,地址=%p\n",i,arrayVariables[i],&arrayVariables[i])
}

//切片去引用数组
sliceVariables = arrayVariables[:]
for i:=0;i<len(sliceVariables);i++ {
   fmt.Printf("sliceVariables[%d]=%d,地址=%p\n",i, sliceVariables[i],&sliceVariables[i])
}


var sliceVariables2 []int
sliceVariables2 = arrayVariables[1:3]
//12,21,23,55,98,2
//[21 23]
fmt.Println(sliceVariables2)
//切片指向的是底层的数组
for i :=0;i<len(sliceVariables2);i++ {
   fmt.Printf("sliceVariables2[%d]=%d,地址=%p\n",i, sliceVariables2[i],&sliceVariables2[i])
}
sliceVariables2[0] = 100

fmt.Println(arrayVariables)
fmt.Println(sliceVariables2)

1.2.定义一个数组,让切片去引用,这种方式,数组可见,分析

2.1.通过make来创建切片,这种方式可以指定切片的大小和容量,未赋值,有默认值 ,这种方式切片对应的数组不可见,由make来维护

//创建一个初始元素个数为 5 的数组切片,元素初始值为 0,并预留 6 个元素的存储空间
var sliceVariables2 []int = make([]int, 5, 6)

分析通过make方式定义切片的内存情况

var sliceVariables3 []int = make([]int,5,6)
fmt.Printf("sliceVariables3的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n",len(sliceVariables3),cap(sliceVariables3),sliceVariables3,&sliceVariables3)

2.2.通过make来创建切片的内存情况

五、切片的遍历(和数组类似)

1. 通过for i:=0;i<len(sliceVariables);i++ {}形式遍历

sliceVariables = arrayVariables[:]
for i:=0;i<len(sliceVariables);i++ {
   fmt.Printf("sliceVariables[%d]=%d,地址=%p\n",i, sliceVariables[i],&sliceVariables[i])
}

2. 通过for..range形式遍历

for key,value := range sliceVariables {
   fmt.Println(key,value)
}

六、切片的追加append

1.创建一个初始元素个数为 5 的数组切片,元素初始值为 0,并预留 6 个元素的存储空间

var sliceVariables3 []int = make([]int,5,6)

var sliceVariables3 []int = make([]int,5,6)
fmt.Printf("sliceVariables3的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n",len(sliceVariables3),cap(sliceVariables3),sliceVariables3,&sliceVariables3)

2.第一次追加切片的容量达到预设的最大容量

sliceVariables3 = append(sliceVariables3,7)
fmt.Printf("第一次追加sliceVariables3的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n",len(sliceVariables3),cap(sliceVariables3),sliceVariables3,&sliceVariables3)

3.第一次追加切片的容量超出了预设的最大值,go语言会新申请一块内存将原始数据拷贝到新的内存当中,切片指向新的内存空间

sliceVariables3 = append(sliceVariables3,8)
fmt.Printf("第二次追加sliceVariables3的长度=%d,容量=%d,\n切片指向的底层数组的地址=%p,切片自己的地址=%p\n",len(sliceVariables3),cap(sliceVariables3),sliceVariables3,&sliceVariables3)

七、切片的拷贝

1.定义源切片

sliceVariables4 := []int{1,2,3,4,5}

2.定义目标切片

sliceVariables5 := make([]int,10)

3.目标切片,源切片,拷贝的数量以两个切片中最小切片的长度为准,copy(目标切片,源切片)

copy(sliceVariables5,sliceVariables4)
fmt.Println(sliceVariables4)
fmt.Println(sliceVariables5)

八、切片做为函数参数

切片是引用类型

切片做为参数传递给函数的意义重大,同数组,当传递较大的数组切片时可以有效的提升cpu执行效率

func changeSlice(slice []int) {
   slice[0] = 100
}

//切片是引用类型
fmt.Println(sliceVariables5)
changeSlice(sliceVariables5)
fmt.Println(sliceVariables5)

八、切片注意事项

1.切片是引用类型
2.切片做为参数传递给函数的意义重大,同数组,当传递较大的数组切片时可以有效的提升cpu执行效率
3.new 用于各种类型的内存分配 返回的是指针,var variables = new(T)
返回的是T,指针类型,即返回的是一个地址,默认是当前类型的零值,它返回了一个指针,指向新分配的类型 T 的零值。也就是说new 返回指针。
4.make 用来分配内存主要用来分配引用类型,比如channel ,map ,slice,返回一个有初始值 (非零) 的 T 类型,不是
T类型

知识大纲 【全栈编程go语言体系课】切片知识大纲,版权@luboke.com,受法律保护。

文章作者: 全栈编程@luboke.com
版权声明: 本文章为全栈编程go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!
copyright © 2020 全栈编程@luboke.com