Golang 切片

定义

func main() {
   //定义一个切片
   arr := [...]int{1, 2, 3, 4}
   //表示截取arr的[1,3)
   sArr := arr[1:3]
   fmt.Println(sArr)  //2,3
   sArr[0] =10
   fmt.Println(sArr)//10,3 用于是引用变量, 所以修改切片也会修改数组
   fmt.Println(arr)// 1,10,3,4
}
func main() {
	//定义一个切片
	arr := [...]int{1, 2, 3, 4}
	//表示截取arr的[1,3)
	sArr := arr[1:3]
	fmt.Println(sArr) //2 ,3
}
type slice struct{
	p *[len]int
	len int //切片长度
	cap int //切片容量
}

创建切片

使用切片时, 必须初始化

	var slice []int //slice未初始化 [], len == 0
	fmt.Println(slice)
	slice[0] = 20// len == 0 panic
	fmt.Println(slice)

方式一: 截取数组

func main() {
	arr := [4]int{1,2,3,4}
	slice1 := arr[0:2] // 截取[0,2)
	fmt.Println(slice1)
}
sliceslice

Golang 切片第1张

方式二: make

capacity >= lengthmakemakeslice
func main() {
	//slice2 := make([]int, 3)len 3,缺省cap, 默认cap == len
	slice2 := make([]int, 3,10)//len 3 , cap 10, cap >= len
	fmt.Printf("slice2 %v, capacity %v, len %v",slice2,cap(slice2),len(slice2))
}
slice

Golang 切片第2张

方式三: slice[]{}

make(type, len)cap == len
func main() {
    var str []string = []string{}//等价 var str = []string{}
	strings := []string{"tom","Jack","Lucy"}//区别于数组arr := [3]int{1,2,3}
	fmt.Printf("strings %v, len %v,cap %v",strings,len(strings),cap(strings))
}

遍历切片

方式一: 普通for循环

func main() {
	slice := []string{"a","b","c","d"}
	for i := 0; i < len(slice); i++ {
		fmt.Printf("%s",slice[i])
	}
}

方式二: for - range

func main() {
	slice := []string{1: `world`, 0: `hello`}
	for idx, val := range slice {
		fmt.Printf("%d, %s 
", idx, val)
	}
}

注意事项

func main() {
	arr := [4]int{1, 2, 3, 4}
	slice := arr[:2] //如果从0开始,等价于 arr[0:2]
	fmt.Println(slice)
	slice = arr[1:] //如果到len(arr),等价于 arr[1:len(arr)]
	fmt.Println(slice)
	slice = arr[:]//如果从0到len(arr),等价于 arr[0:len(arr)]
	fmt.Println(slice)
}
func main() {
	arr := [4]int{1, 2, 3, 4}
	slice1 :=arr[:]
	fmt.Println(slice1)
	//切片可以继续切片
	slice2 := slice1[:3]
	fmt.Println(slice2)
    -------------------------
    arr := [3]int{100,200,300}
	slice1 := arr[:]
	slice2 := slice1[:]
	fmt.Println(slice1,slice2)
	slice2[0] = 400
	fmt.Println(slice1,slice2)
}
func main() {
	slice := []int{100,200,300}
	fmt.Println(slice)
	//append返回一个新的切片
	slice = append(slice, 400, 500)
	fmt.Println(slice)
    -----------------------
    slice1 := []int{100, 200, 300}
	slice2 := []int{400, 500}
	//追加一个切片到slice
	slice1 = append(slice1, slice2...)
	fmt.Println(slice1)
}
func main() {
	slice1 := []int{100,200,300}
	slice2 := make([]int,5)
	fmt.Println(slice2)
	//将slice1拷贝到slice2
	copy(slice2,slice1 )
	fmt.Println(slice2)
}