理解切片,前提需要搞清楚切片的出现是为了解决什么问题。为了介绍数组数据个数不可变的问题。
目录
一,切片是一个引用类型的数据类型
一块内存空间需要被我们所利用,需要用变量名来指代这个内存空间的起始位置,然后再操作这块内存,比如: var slice []int。那么问题来了,变量名slice放在内存的哪个位置呢?答案是,栈。变量slice的值是什么?答案是它所指向的内存空间地址。
引用类型就是:变量名储存在栈区,但是变量的值是他所指向的内存地址,需要通过变量所保存的地址去找到指定的内存块,再进行操作。
二,切片的本质(两种理解)
1,数据个数不确定的数组
数组在go编译时就已经确定了数据个数,当程序运行之后数据个数不可改变。切片类型在程序运行之后还可以动态的添加数据,数据个数可变。
package main
import "fmt"
func main() {
var arr = [3]int{1,2,3}
// 声明一个个数为3的数组并赋初值
for i:=0;i<3;i++{
fmt.Println(arr[i])}
}
//arr是一个数据个数为3的数组,编译之后,只能利用arr[0],arr[1],arr[2]访问三个数据
/*---------------------------------------------------------------------------*/
func test() {
var arr1 []int
//声明一个切片,不能写大小以表示数据个数可以改变,编译之后可以任意添加数据
}
2,一个指向数组元素内存地址的"无限大"内存空间
当然,这个起始地址不能乱指。只能指向已经存在的数组元素地址或者新创建的空白数组的元素地址。
三,切片的使用方法
1,数组切片之后得到的就是一个切片类型
2,使用make创建切片
3,直接指向已经存在数组的首地址
四,总结
切片与数组就是两兄弟,只不过实现的功能不同。数组由于数据个数不能改变而不能满足需求。于是,在数组的基础上添加了自动增加数据个数的功能,这就是切片。
切片就是一个结构体,他仍然离不开数组,因为切片的第一个成员必须指向一个数组的某一个位置,然后从这个位置向后面一直延伸。