007.golang 切片slice

切片Slice

  • 其本身并不是数组,它指向底层的数组
  • 作为变长数组的替代方案,可以关联底层数组的局部或全部
    为引用类型
  • 可以直接创建或从底层数组获取生成
  • 使用len()获取元素个数,cap()获取容量
  • 一般使用make()创建
  • 如果多个slice指向相同底层数组,其中一个的值改变会影响全部

  • make([]T, len, cap)

    • 其中cap可以省略,则和len的值相同
    • len表示存数的元素个数,cap表示容量

package main

import (
    "fmt"
)

func main() {
    //空的slice
    var s1 []int
    fmt.Println(s1)
    //创建一个数组
    a := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    fmt.Println(a)
    //获取索引从5到9的元素
    s2 := a[5:10] //包含开始索引,不包含结束索引
    fmt.Println(s2)
    //获取第七个以后所有的元素
    s3 := a[7:]
    fmt.Println(s3)
    //获取刚开始的前三个元素
    s4 := a[:3]
    fmt.Println(s4)
    //获取数组的所有元素 等价于 =
    s5 := a[:]
    s6 := a
    fmt.Println(s5)
    fmt.Println(s6)
}

这里写图片描述


这里写图片描述


package main

import (
    "fmt"
)

func main() {
    //表示此切片初始容量为3,
    //可以容纳为10
    //如果超过10就会自动扩容+10
    s1 := make([]int, 3, 10)
    fmt.Println(s1)
    fmt.Println(len(s1), cap(s1))

    a := []byte{'a', 'b', 'c', 'd', 'd', '.', 'w', 'r', 'v', '4', '3', '2'}
    s2 := a[2:4]
    fmt.Println(string(s2))
}

这里写图片描述


Reslice

  • Reslice时索引以被slice的切片为准
  • 索引不可以超过被slice的切片的容量cap()值
  • 索引越界不会导致底层数组的重新分配而是引发错误
package main

import (
    "fmt"
)

func main() {

    a := []byte{'a', 'b', 'c', 'd', 'd', '.', 'w', 'r', 'v', '4', '3', '2'}
    s2 := a[2:4]
    s3 := s2[1:2]
    s4 := s2[1:8]
    fmt.Println(string(s2))
    fmt.Println(string(s3))
    fmt.Println(string(s4))
}

这里写图片描述


Append

  • 可以在slice尾部追加元素
  • 可以将一个slice追加在另一个slice尾部
  • 如果最终长度未超过追加到slice的容量则返回原始slice
  • 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
package main

import (
    "fmt"
)

func main() {

    s1 := make([]int, 3, 6)
    fmt.Printf("%p\n", s1)
    s1 = append(s1, 1, 2, 3)
    fmt.Printf("%v %p\n", s1, s1)
    s1 = append(s1, 1, 2, 3)
    fmt.Printf("%v %p\n", s1, s1)
}

这里写图片描述


package main

import (
    "fmt"
)

func main() {

    a := []int{1, 2, 3, 4, 5}
    fmt.Println(a)
    //指向底层的数组
    s1 := a[2:5]
    s2 := a[1:3]
    s3 := a[1:3]

    fmt.Println(s1, s2)
    //如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
    s3 = append(s3, 1, 1, 1, 1, 1, 1, 1, 1)
    //更改元素后,底层数组相应的也会更改
    s1[0] = 9
    fmt.Println(s1, s2)
    fmt.Println(s3)
    fmt.Println(a)
}

这里写图片描述


Copy

package main

import (
    "fmt"
)

func main() {

    s1 := []int{1, 2, 3, 4, 5, 6}
    s2 := []int{7, 8, 9}
    s3 := []int{7, 8, 9}

    copy(s2, s1)
    copy(s1, s3)
    fmt.Println(s2)
    fmt.Println(s1)

}

这里写图片描述


package main

import (
    "fmt"
)

func main() {

    s1 := []int{1, 2, 3, 4, 5, 6}
    s2 := []int{7, 8, 9, 10, 11}

    copy(s2[2:4], s1[4:6])
    fmt.Println(s2)
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值