Go数组和切片

数组


定义数组

var array1 [5]int
array2 := [3]int {1, 2, 3}
array3 := [...]int {1, 2, 3}

循环数组

for key, value := range arrays {
    ......
}

for _, value := range arrays {
    ......
}

数组作为参数是值传递,go语言数组可以通过切片来代替数组指针多数需求


切片


定义切片

array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
slice2 := array[2:]
slice3 := array[:2]
slice4 := array [:]
  • slice本身没有值,slice是对array底层的一个view。
array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
slice1[0] = 10 
fmt.Println(array) // 1, 2, 10, 4, 5
  • slice可以对slice本身再次slice
array := [...]int{1, 2, 3, 4, 5}
slice1 := array[2:4]
fmt.Println(slice1) // 3, 4
slice1 = slice1[1:]
fmt.Println(slice1) // 4

切片的扩展

array := [...]int{0, 1, 2, 3, 4, 5}
slice1 := array[1:3]
fmt.Println(slice1) // 1, 2, 
slice2 := slice1[1:4]
fmt.Println(slice2) // 2, 3, 4
fmt.Println(slice1[4]) // 报错

slice组成

  • ptr slice在数组上的开始位置指针
  • len slice的长度
  • cap slice对应的array从ptr开始到结束的整个长度

所以 slice2 := slice1[1:4]正确,fmt.Println(slice1[4])报错。

切片的扩展总结

  • slice可以reslice
  • slice可以向后扩展,不可以向前扩展
  • s[n],n不能超过len(s)。向后扩展不能超过cap(s)

切片的操作

arr := [...]int{0, 1, 2, 3, 4, 5}
s1 := arr[3:5]
s2 := append(s1, 10)
s3 := append(s2, 11)
fmt.Println("s1 s2 s3 = ", s1, s2, s3) // [3, 4] [3, 4, 10], [3, 4, 10, 11]
fmt.Println("arr = ", arr) // [0, 1, 2, 3, 4, 10]


// create
s4 := make([]int, 16, 32) // slice16 底层数组32
// copy
copy(s4, s1) // s4 [3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
fmt.Println(s4, len(s4), cap(s4)) // [3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 16 32
// delete
s4 = append(s4[:1], s4[2:]...)
fmt.Println(s4, len(s4), cap(s4)) // [3 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 15 32

切片操作总结

  • 添加元素超过cap,系统会重新分配更大的底层数组
  • 添加元素为超过cap,会覆盖底层数组append位置上的值
  • 由于值传递的关系,必须接受append返回值

猜你喜欢

转载自blog.csdn.net/YeYuLuoJin/article/details/81385489