切片
每个数组的大小都是固定的。而切片则为数组元素提供动态大小的、灵活的视角。在实践中,切片比数组更常用。
一、切片的定义
类型 []T 表示一个元素类型为 T 的切片。
切片通过两个下标来界定,即一个上界和一个下界,二者以冒号分隔:
a[low : high]
它会选择一个半开区间,包括第一个元素,但排除最后一个元素。
半开区间,包括前面不包括后面。
以下表达式创建了一个切片,它包含 a 中下标从 1 到 3 的元素:
a[1:4]
下面写一个例子:
package main
import "fmt"
func main() {
//定义一个6位长度的数组
primes := [6]int{2,4,5,7,9,11}
fmt.Println(primes)
//定义一个切片,去上面数组中,索引从1-3之间的三个数,1,2,3
var s []int = primes[1:4]
fmt.Println(s)
}
输出结果是:
[2 4 5 7 9 11]
[4 5 7]
二、切片就像数组的引用
切片并不存储任何数据,它只是描述了底层数组中的一段。
更改切片的元素会修改其底层数组中对应的元素。
与它共享底层数组的切片都会观测到这些修改。
下面来看一个例子:
package main
import "fmt"
func main() {
names := [4]string{
"John",
"Paul",
"George",
"Ringo",
}
fmt.Println(names)
//半开区间,使用切片的方式,a取names中的索引是0,1的数据
a := names[0:2]
//半开区间,使用切片的方式,b取names中的索引是1,2的数据
b := names[1:3]
fmt.Println(a)
fmt.Println(b)
//修改b切片中索引为0的值
b[0] = "XXX"
fmt.Println(b)
//会发现,因为b切片中的索引为0的对应于数组names中的索引为0
//改变了b切片中的值,names中对应的值也得到了改变
fmt.Println(names)
}
看一下输出结果:
[John Paul George Ringo]
[John Paul]
[Paul George]
[XXX George]
[John XXX George Ringo]
三、切片文法
切片文法类似于没有长度的数组文法。
这是一个数组文法:
[3]bool{
true, true, false}
下面这样则会创建一个和上面相同的数组,然后构建一个引用了它的切片:
[]bool{
true, true, false}
下面来看一个例子:
package main
import "fmt"
func main() {
//按照传统的数组创建一个3位长度的数组
arr := [3]bool{
true, true, false}
fmt.Println(arr)
//创建一个切片
m := []bool{
true, true, false}
fmt.Println(m)
//数组a和切片q,输出的效果是一样的
//定义一个int类型的切片
q := []int{2,4,5,64,32,53}
fmt.Print