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返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值