切片是对其底层数组的某一段的引用
切片有len和cap两个属性,代表引用长度和切片容量
append属于内置函数,可以对slice添加一个或多个元素,也可以添加数组类型的值
slice在操作时需要注意:slice底层指向一个数据,操作时必须注意当底层数组无法容纳新增元素时,append会分配一个更大的数组来容纳slice,从而导致slice指向的底层数组发生变化
示例1:

s1:=[]int{1,2,3,4,5}
s2:=s1[1:3]
s2=append(s2,6,7,8,9)
fmt.Println(s1,s2)

打印结果:[1 2 3 4 5] [2 3 6 7 8 9]
因为原始的数组无法容纳之后的6,7,8,9,因此直接分配了一个新的底层数组
示例2:

s1:=[]int{1,2,3,4,5}
s2:=s1[1:3]
for i:=6;i<10;i++{
    s2=append(s2,i)
}
fmt.Println(s1,s2)

输出结果:[1 2 3 6 7] [2 3 6 7 8 9]
当原始数组可以容纳6,7会底层底层数组变更
注意:在做append操作时,一定要将append的结果重新赋给一个slice,防止由于底层数组的变更导致的数据错误

slice末尾追加一个或多个元素

当追加元素时,发现slice的len>cap时,会重新开辟2*cap的内存空间区储存slice元素
如果追加元素后slice的len<=cap,则append返回的新生成的slice的内存地址依旧是传入的slice内存地址
append总是在当前slice的最后添加元素当我们用
var sli = make([]string,10)
注意:初始化sli就相当于创建了10个元素,每一个元素的值都是空串,调用append函数的时已有10个元素,所以会被添加到第11个元素中

package main
import (
    "fmt"
)
func main(){
    var s = make([]string, 10)
    fmt.Println("最初的切片")
    fmt.Println("底层长度", cap(s))
    fmt.Println("地址空间", &s[0])
    fmt.Println("当len>cap时,追加元素")
    s = append(s, "hello")
    fmt.Println("底层长度", cap(s))
    fmt.Println("地址空间", &s[0])
    fmt.Println("当len<cap时,追加元素")
    s = append(s, "lion")
    fmt.Println("底层长度", cap(s))
    fmt.Println("地址空间", &s[0])
    for i, v := range s {
        fmt.Printf("s[%d]=[%s]\n", i, v)
    }
}

执行结果

最初的切片
底层长度 10
地址空间 0xc00006a0a0
当len>cap时,追加元素
底层长度 20
地址空间 0xc00006c140
当len<cap时,追加元素
底层长度 20
地址空间 0xc00006c140
s[0]=[]
s[1]=[]
s[2]=[]
s[3]=[]
s[4]=[]
s[5]=[]
s[6]=[]
s[7]=[]
s[8]=[]
s[9]=[]
s[10]=[hello]
s[11]=[lion]

删除切片中的元素

删除索引从i到j的元素(包含i不包含j)

package main
import (
    "fmt"
)
func main(){
    s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    fmt.Println(s)
    s = append(s[:2], s[4:]...)
    fmt.Println(s)
}

执行结果

[0 1 2 3 4 5 6 7 8 9]
[0 1 4 5 6 7 8 9]

切片截取

示例:

s := []int{1, 2, 3, 4, 5, 6}
slice := s[0:3:5]
fmt.Println(slice)
//[1 2 3]

s[0:3:5]是什么意思呢?
我们可以使用s[low:high:max]来表示
第一个数(low)表示下标的起点(从该位置开始截取),如果low取值为0表示从第一个元素开始截取,也就是对应的切片s中的1
第二个数(high)表示取到哪结束,也就是下标的终点(不包含该位置),3表示取出下标是0,1,2的数据(1,2,3),不包括下标为3的数据,那么也就是说取出的数据长度是3. 可以根据公式:3-0 计算(len=high-low),也就是第二个数减去第一个数,差就是数据长度。在这里可以将长度理解成取出的数据的个数。
第三个数用来计算容量,所谓容量:是指切片目前可容纳的最多元素个数。通过公式5-0计算(cap=max-low),也就是第三个数据减去第一个数。该案例中容量为5

Last modification:May 20th, 2020 at 10:33 pm
如果觉得我的文章对你有用,请随意赞赏