其实啊,切片就好像一个完整的蛋糕,你用刀切了一小块,而这一块就是从那完整的蛋糕切了下来。
1、生成切片
首先,需要了解的是,到底什么是切片
呢?
其实啊,切片就好像一个完整的蛋糕,你用刀切了一小块,而这一块就是从那完整的蛋糕切了下来。
切片是对数组的某一个连续片段的引用,当然咯,这个片段也可以是整个数组。
slice [start : end]
//slice: 目标切片对象
//start: 目标切片对象的开始索引
//end: 目标切片对象的结束索引
需要注意的是,切片内不包括结束索引所指向的项
。
package main
import "fmt"
func main() {
siteConf := [...]string{"秋码记录", "https://qiucode.cn", "秋码淘好货"}
fmt.Println(siteConf, siteConf[1:2])
}
1.1、指定范围生成切片
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])
}
1.2、原切片
当开始索引
和结束索引
都被忽略时,生成的切片与没有生成的对象一致。
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
fmt.Println(a, a[:])
}
1.3、空切片
若将开始索引
与结束索引
都设为0
的话,那么将会生成空切片
。
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
fmt.Println(a, a[0:0])
}
2、声明切片
除了可以从数组或切片中生成切片外,还可以声明一个新的切片,其声明与数组声明方式很相似。
var name []Type
//name:切片的变量名称
//Type: 切片的元素类型
代码说明如下:
- 第 8 行,声明一个字符串切片,切片中拥有多个字符串。
- 第 10 行,声明一个整型切片,切片中拥有多个整型数值。
- 第 12 行,将
numListEmpty
声明为一个整型切片,本来会在{}
中填充切片的初始化元素,这里没有填充,所以切片是空的,但是此时的numListEmpty
已经被分配了内存,只是还没有元素。 - 第 14 行,切片均没有任何元素,3 个切片输出元素内容均为空。
- 第 16 行,没有对切片进行任何操作,strList 和 numList 没有指向任何数组或者其他切片。
- 第 18 行和第 19 行,声明但未使用的切片的默认值是
nil
,strList
和numList
也是nil
,所以和 nil 比较的结果是true
。 - 第 20 行,
numListEmpty
已经被分配到了内存,但没有元素,因此和nil
比较时是false
。
切片是动态结构,只能与 nil 判定相等,不能互相判定相等。声明新的切片后,可以使用 append()
函数向切片中添加元素。
3、make() 函数构造切片
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))
}