首先,需要了解的是,到底什么是切片
呢?
其实啊,切片就好像一个完整的蛋糕,你用刀切了一小块,而这一块就是从那完整的蛋糕切了下来。
切片
是对数组的某一个连续片段的引用,当然咯,这个片段也可以是整个数组。
slice [start : end]
//slice: 目标切片对象
//start: 目标切片对象的开始索引
//end: 目标切片对象的结束索引
需要注意的是,切片内不包括结束索引所指向的项
。
package main
import "fmt"
func main() {
siteConf := [...]string{"秋码记录", "https://qiucode.cn", "秋码淘好货"}
fmt.Println(siteConf, siteConf[1:2])
}
package main
import "fmt"
func main() {
var arr [30]int
for i := 0; i < 30; i++ {
arr[i] = i + 1
}
// 区间
fmt.Println(arr[10:15])
// 中间到尾部的所有元素
fmt.Println(arr[20:])
// 开头到中间指定位置的所有元素
fmt.Println(arr[:2])
}
当开始索引
和结束索引
都被忽略时,生成的切片与没有生成的对象一致。
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
fmt.Println(a, a[:])
}
若将开始索引
与结束索引
都设为0
的话,那么将会生成空切片
。
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
fmt.Println(a, a[0:0])
}
除了可以从数组或切片中生成切片外,还可以声明一个新的切片,其声明与数组声明方式很相似。
var name []Type
//name:切片的变量名称
//Type: 切片的元素类型
代码说明如下:
numListEmpty
声明为一个整型切片,本来会在{}
中填充切片的初始化元素,这里没有填充,所以切片是空的,但是此时的 numListEmpty
已经被分配了内存,只是还没有元素。nil
,strList
和 numList
也是 nil
,所以和 nil 比较的结果是 true
。numListEmpty
已经被分配到了内存,但没有元素,因此和 nil
比较时是 false
。切片是动态结构,只能与 nil 判定相等,不能互相判定相等。声明新的切片后,可以使用 append()
函数向切片中添加元素。
make()
是Go
内置函数,其函数定义:
make([]Type, size, cap)
其中Type
是指切片的元素类型,size
指的是为这个类型分配多少个元素,cap
为预分配的元素数量,这个值设定后不影响 size
,只是能提前分配空间,降低多次分配空间造成的性能问题。
package main
import "fmt"
func main() {
a := make([]int, 3)
b := make([]int, 3, 15)
fmt.Println(a, b)
fmt.Println(len(a), len(b))
}