1、4种声明+判空
package mainimport "fmt"func main() {//声明 slice1是一个切片,并且初始化,默认值是1,2,3,长度是3slice1 := []int{1,2,3}fmt.Println("len =",len(slice1),", array = ",slice1)//声明 slice2是一个切片,但没有给slice分配空间var slice2 []intfmt.Println("len =",len(slice2),", array = ",slice2)//make 开辟三个空间slice2 = make([]int,3)fmt.Println("len =",len(slice2),", array = ",slice2)slice2[0] = 222fmt.Println("len =",len(slice2),", array = ",slice2)//声明 slice3是一个切片,同时给slice3分配空间,3个空间,初始化为0var slice3 []int = make([]int,3)fmt.Println(slice3)//声明 slice4 是 slice3的简写slice4 := make([]int,3)fmt.Println(slice4)//判断一个slice是否为0if slice2 == nil{fmt.Println("空切片")}else{fmt.Println("非空")}}
2、cap 容量

1)通过append 追加元素,len值变成,cap值不变(直到len = cap)
2)当len = cap ,go底层会自动再开辟一个 cap空间,cap值会变化

package mainimport "fmt"func main() {//声明一个切片,长度3,容量5slice1 := make([]int,3,5)fmt.Printf("原始:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)// 向切片追加一个元素,len = 4,cap =5slice1 = append(slice1,1)fmt.Printf("追加元素1:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)// 向切片追加一个元素,len = 5,cap =5slice1 = append(slice1,2)fmt.Printf("追加元素2:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)// 向切片追加一个元素,len = 6,cap =10slice1 = append(slice1,3)fmt.Printf("追加元素3:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)}
3、截取 和 copy
package mainimport "fmt"func main() {s := []int{1,2,3,4}//切片截取,[0,3)s1 := s[0:3]fmt.Println("截取后s1=",s1)//s1 和 s 指向的是同一片内存区域,改了s1指向内存的数据,s切片取出来的值肯定也是改变了的s1[0] = 100;fmt.Println("修改s1的值后:---------")fmt.Println("s=",s)fmt.Println("s1",s1)//可以用copy方向,使两个指针指向不同的内存区域//make新开辟一块内存,s2指向新内存空间,s2 [0 0 0 0]s2 := make([]int,4)copy(s2,s) // s2 [1 2 3 4]fmt.Println("copy切片s后,s2=",s2)s2[0] = 200;fmt.Println("修改s2的值后:---------")fmt.Println("s=",s)fmt.Println("s2",s2)}
结果:
