切片(slice)

来源:互联网 发布:红色复仇扫矿软件 编辑:程序博客网 时间:2024/06/06 03:18

切片是动态数组,比数组灵活。数组长度不可变,但是切片可以追加。 切片原型定义如下:

struct Slice{  byte *array;  unit32 len;  unit32 cap;};

它抽象为以下三个部分:
1. 指向被引用的底层数组的指针;
2. 切片中元素的个数;
3. 切片分配的存储空间。

声明、定义和初始化

声明一个切片:

var sliceTest []int
  • 声明的切片是nil,不初始化无法插入数据
  • 跟map一样,通过make定义切片
make([]T, length, capacity)
  • length为初始长度,为必须参数。capacity为指定容量,可选。
    例如:
sliceTest = make([]int, 10)
  • 直接初始化切片
sliceTest1 := [] int {1,2,3}
  • 引用赋值

s := arr[startIndex:endIndex]

初始化s,是arr从startIndex到endIndex的引用

s := sliceTest1[:]//s表示sliceTest的引用s1 := sliceTest[1]

append

  • append主要用于给某个切片(slice)追加元素
  • 如果该切片存储空间(cap)足够,就直接追加,长度(len)变长;如果空间不足,就会重新开辟内存,并将之前的元素和新的元素一同拷贝进去
  • 第一个参数为切片,后面是该切片存储元素类型的可变参数

代码例子

package mainimport (    "fmt")func main(){    var sliceTest []int    //声明的切片是nil    if sliceTest == nil {        fmt.Println("slice is nil")    }    //用make创建切片,制定默认长度    sliceTest = make([]int, 2)    sliceTest[0] = 1    fmt.Printf("len:%d, cap:%d\n", len(sliceTest), cap(sliceTest))    sliceTest[1] = 2    //通过range遍历切片    for i, v := range sliceTest{        fmt.Printf("index:%d, value:%d\n", i, v)    }    //切片默认长度是2,不能直接通过下标增加长度    //sliceTest[2] = 2 //程序崩溃,提示"panic: runtime error: index out of range"    //sliceTest[3] = 3    //通过append添加元素到切片中    sliceTest = append(sliceTest, 3)    fmt.Printf("len:%d, cap:%d\n", len(sliceTest), cap(sliceTest))//第一次append将cap增加了2    sliceTest = append(sliceTest, 4)    fmt.Printf("len:%d, cap:%d\n", len(sliceTest), cap(sliceTest))//第二次append,因为还有空间,cap没增加    for i := 0; i < len(sliceTest); i++ {        fmt.Printf("index:%d, value:%d\n", i, sliceTest[i])    }    s := sliceTest[:]//s引用sliceTest    fmt.Printf("s, len:%d, cap:%d\n", len(s), cap(s))    for i := 0; i < len(s); i++ {        fmt.Printf("s, index:%d, value:%d\n", i, s[i])    }    s1 := s[2:4]//s1引用s下标2-4的元素(不包含下标4)    fmt.Printf("s1, len:%d, cap:%d\n", len(s1), cap(s1))    for i := 0; i < len(s1); i++ {        fmt.Printf("s1, index:%d, value:%d\n", i, s1[i])    }    s1[1] = 14 //改变s1中的值    for i := 0; i < len(sliceTest); i++ {        fmt.Printf("sliceTest, index:%d, value:%d\n", i, sliceTest[i])//因为切片是引用类型,所以修改会反应到sliceTest中    }    s2 := s[:2]    fmt.Printf("s2, len:%d, cap:%d\n", len(s2), cap(s2))    for i := 0; i < len(s2); i++ {        fmt.Printf("s2, index:%d, value:%d\n", i, s2[i])    }    s2 = append(s2, 23)//s2的cap=4,len=2,空间充足,直接追加    fmt.Printf("s2, len:%d, cap:%d\n", len(s2), cap(s2))    for i := 0; i < len(sliceTest); i++ {//sliceTest跟s2指向同一个slice,所以        fmt.Printf("sliceTest, index:%d, value:%d\n", i, sliceTest[i])    }    s2 = append(s2, 24)    fmt.Printf("s2, len:%d, cap:%d\n", len(s2), cap(s2))    for i := 0; i < len(sliceTest); i++ {        fmt.Printf("sliceTest, index:%d, value:%d\n", i, sliceTest[i])    }    for i := 0; i < len(s2); i++ {        fmt.Printf("s2, index:%d, value:%d\n", i, s2[i])    }    s3 := append(s2, 25, 26, 27)//s2继续添加,因为容量不够,所以要从新分配内存,将之前的元素copy过去,再赋值给s3。此时s2没有变,还是sliceTest的引用    s2[0] = 21//此时更改s2[0],会更改到sliceTest[0]    s3[0] = 31//此时更改s3[0],不会更改到sliceTest[0]    fmt.Printf("s2, len:%d, cap:%d\n", len(s2), cap(s2))    fmt.Printf("s3, len:%d, cap:%d\n", len(s3), cap(s3))    for i := 0; i < len(sliceTest); i++ {        fmt.Printf("sliceTest, index:%d, value:%d\n", i, sliceTest[i])    }    for i := 0; i < len(s2); i++ {        fmt.Printf("s2, index:%d, value:%d\n", i, s2[i])    }    for i := 0; i < len(s3); i++ {        fmt.Printf("s3, index:%d, value:%d\n", i, s3[i])    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 重要考试考砸了怎么办 二年级孩子做数学题粗心怎么办 二年级孩子考试粗心怎么办 二年级孩子考试总是粗心怎么办 二年级孩子总是粗心怎么办 小学一年级孩子抄别人作业怎么办 被老师发现抄答案怎么办 考试抄答案被老师发现怎么办 孩子撒谎不写作业怎么办 小学生做题容易马虎出错怎么办 小学生做题老是马虎怎么办 小学生做题马虎不认真怎么办 会做的题总做错怎么办 孩子数学做题粗心怎么办 孩子成绩考差了怎么办 孩子静不下心学习怎么办 孩子考试时总是粗心马虎怎么办 小学二年级学生厌学怎么办 三岁宝宝肚脐痛怎么办 做题速度太慢怎么办 孩子做题不动脑不会转弯怎么办? 孩子做题总是马虎怎么办 孩子做题总是眼高手低怎么办 小孩说幼儿园老师不喜欢他怎么办 初中学生了不喜欢读书怎么办 小孩吐怎么办给揉哪里 8岁了不爱写字怎么办呢 8岁了不会写字怎么办呢 高考做题时犯各种粗心错误怎么办 孩子做题不认真读题怎么办 孩子不爱学习怎么办有什么办法 小孩字写的不好怎么办 孩子的字写得丑怎么办 一年级孩子生字默不出来怎么办 5岁宝宝不爱写字怎么办 三年级小孩不自觉做作业怎么办 一年级的孩子不爱写字怎么办 一年级孩子不爱写作业怎么办 一年级的小孩不爱写字怎么办 小孩儿写字做作业磨蹭怎么办 孩子不学习成绩差不写作业怎么办