0. 前言
Golang 中切片是什么,为什么需要切片。带着这个疑问我们来看下面这个问题
需求 需要一个数组用于保存学生的成绩,但是学生的个数是不确定的,请问怎么办?
解决方案:切片。切片是对数组的抽象,或者说切片是对数组的引用。前面我们说过,Golang 数组的长度不可改变,上面需求中就不太适用,Golang 提供了一种灵活,功能强悍的内置类型切片,可以把他看做为动态数组,类似于java的list集合一样,与数组相比切片的长度是不固定的,可以添加元素使切片的容量增大。
1. 切片的基本介绍
- 切片的英文是slice
- 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。
- 切片的使用和数组类似,遍历切片、访问切片的元素和求切片长度len(slice)都一样。
- 切片的长度是可以变化的,因此切片是一个可以动态变化数组。
语法:var identifier []type
案例
func main()
// 切片的基本使用
var intArr[5]int=[..]int{1,22,33,66,99}
//1.s1ice就是切片名
//2.intArr[1:3]表示slice引用到intArr这个数组
//3.引用intArr数组的起始下标为1,最后的下标为3(但是不包含3)
slice := intArr[1:3]
fmt.Println("intArr=",intArr)
fmt.Println("slice的元素是=",s1ice)
fmt.Print1n("slice的元素个数=",1en(slice))
fmt.Println("slice的容量=”,cap(slice)
}
复制代码
2. 内存展现
总结:从上面可以看到
- slice的确是一个引用类型
- slice从底层来说,其实就是一个数据结构(struct?结构体)
type slice struct
ptr *[2]int
len int
cap int
}
复制代码
3. 使用
第一种方式:定义一个切片,然后让切片去引用一个已经创建好的数组
func main()
slice := intArr[1:3]
fmt.Println("intArr=",intArr)
fmt.Println("slice的元素是=",s1ice)
fmt.Print1n("slice的元素个数=",1en(slice))
fmt.Println("slice的容量=”,cap(slice)
}
复制代码
第二种方式:通过make来创建切片,基本语法:var 切片名 []type = make([]type,len,[cap])
参数说明:
- type:就是数据类型
- len:大小
- cap:指定切片容量,可选,如果你分配了cap,则要求cap>=len.
总结:
- 通过make方式创建切片可以指定切片的大小和容量
- 如果没有给切片的各个元素赋值,那么就会使用默认值
- 通过make方式创建的切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素
两种方式的区别
第一种方式是直接引用数组,这个数组是事先存在的,程序员是可见的。
第二种方式2通过make来创建切片,make也会创建一个数组,是由切片在底层进行维护,程序员是看不见的。make创建切片的示意图。
本文正在参加技术专题18期-聊聊Go语言框架