一、定义方式就不多说了,自己运行代码试一试就知道了~
package main
import "fmt"
func main() {
//第一种::声明slice1是一个切片,并且初始化,默认值是1,2,3,长度是3
//slice1 := []int{1, 2, 3}
//第二种::声明一个slice1是一个切片,但是并没有给slice分配空间
//var slice1 []int
//这个时候如果写slice1【0】=1,就会报错,因为还没有给slice1分配空间
//slice1[0] = 1,错误是:"runtime error: index out of range [0] with length 0"
//通过make开辟空间
//slice1 = make([]int, 3) //开辟三个容量,此时默认值是0
//slice1[1] = 1000
//第三种::声明一个slice1是一个切片,同时给slice分配3个空间,初始化为0
//var slice1[]int=make([]int, 3)
//或者用通过:=推导出slice是一个切片
slice1 := make([]int, 3)
//fmt.Printf("len = %d,slice = %v\n", len(slice1), slice1) //"%v表示打印所有信息"
//判断一个slice是否为0
if slice1 == nil {
fmt.Println("slice是一个空切片")//第十行会是一个空切片
} else {
fmt.Println("slice不是一个空切片")//20行的可不是空切片
}
}
make(1,2,3):1.表示类型,2.表示长度,3.表示容量
二、切片追加
使用append进行追加,代码如下
package main
import "fmt"
func main() {
var numbers = make([]int, 3, 5) //len=3,cap=5
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
//想numbers追加一个元素1,len=4,cap=5
numbers = append(numbers, 1)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
numbers = append(numbers, 2)
//向一个满容cap的slice追加元素
numbers = append(numbers, 3)
fmt.Printf("len=%d,cap=%d,slice=%v\n", len(numbers), cap(numbers), numbers)
//cap会扩大两倍
}
注意:当cap(容量)满了的时候再去追加,cap会自动变成原来的两倍。总结,如下图
三、切片的截取
截取很简单的,直接看代码吧
package main
import "fmt"
func main() {
s := []int{1, 2, 3} //len=3,cap=3
s1 := s[0:2] //从索引下标0开始,截取两个元素。截取1,2
fmt.Println(s1) //【1 2】
//注意此时改变了s1的第一个值,s的值也会改变,因为他俩指定的同一块内存地址
s1[0] = 100
fmt.Println(s)
fmt.Println(s1)
//如果想不改变s的值,那么可以用copy进行拷贝
s2 := make([]int, 3)
copy(s2, s) //将s中的值拷贝给s2
s2[0] = 100
//fmt.Println(s) //[1 2 3]
fmt.Println(s2) //[100 2 3]
}
当然我还演示了,如何在截取之后改变截取的值而不改变原切片的值