1、4种声明+判空
package main
import "fmt"
func main() {
//声明 slice1是一个切片,并且初始化,默认值是1,2,3,长度是3
slice1 := []int{1,2,3}
fmt.Println("len =",len(slice1),", array = ",slice1)
//声明 slice2是一个切片,但没有给slice分配空间
var slice2 []int
fmt.Println("len =",len(slice2),", array = ",slice2)
//make 开辟三个空间
slice2 = make([]int,3)
fmt.Println("len =",len(slice2),", array = ",slice2)
slice2[0] = 222
fmt.Println("len =",len(slice2),", array = ",slice2)
//声明 slice3是一个切片,同时给slice3分配空间,3个空间,初始化为0
var slice3 []int = make([]int,3)
fmt.Println(slice3)
//声明 slice4 是 slice3的简写
slice4 := make([]int,3)
fmt.Println(slice4)
//判断一个slice是否为0
if slice2 == nil{
fmt.Println("空切片")
}else{
fmt.Println("非空")
}
}
2、cap 容量
1)通过append 追加元素,len值变成,cap值不变(直到len = cap)
2)当len = cap ,go底层会自动再开辟一个 cap空间,cap值会变化
package main
import "fmt"
func main() {
//声明一个切片,长度3,容量5
slice1 := make([]int,3,5)
fmt.Printf("原始:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
// 向切片追加一个元素,len = 4,cap =5
slice1 = append(slice1,1)
fmt.Printf("追加元素1:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
// 向切片追加一个元素,len = 5,cap =5
slice1 = append(slice1,2)
fmt.Printf("追加元素2:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
// 向切片追加一个元素,len = 6,cap =10
slice1 = append(slice1,3)
fmt.Printf("追加元素3:len = %d,cap = %d,slice = %v\n",len(slice1),cap(slice1),slice1)
}
3、截取 和 copy
package main
import "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)
}
结果: