内容简介:其中切片是基于数据中连续片段的引用,是一个引用类型。与数组不同的是,切片的长度可以在运行时修改。使用上可以将切片看作是长度可变的数组。即使超过了底层数组的最大长度,也可以继续扩容。图例为:切片的实现是由一个底层数组以及其上面的动态位置,尺寸来实现。由内部由指向起始元素的指针、元素数量length和容量capacity组成。其中:
1 概述
其中切片是基于数据中连续片段的引用,是一个引用类型。与数组不同的是,切片的长度可以在运行时修改。使用上可以将切片看作是长度可变的数组。即使超过了底层数组的最大长度,也可以继续扩容。
图例为:
切片的实现是由一个底层数组以及其上面的动态位置,尺寸来实现。由内部由指向起始元素的指针、元素数量length和容量capacity组成。其中:
- 指针ptr,用于指向切片在底层数组的起始位置。
- 尺寸len,用于记录切片内元素数量。
- 容量cap,当前切片最大容量,也就是底层数组的容量。可以动态分配。
当使用不定数量参数时,函数得到的参数也是切片类型。
切片为引用类型,因此切片的默认初始值为nil。
2 创建切片
语法整理如下:
- []type,切片类型
- []type{v1, v2, v3},定义时指定初始值
- make([]type, len),make开辟内存空间,指定类型和长度
- make([]type, len, cap),make开辟切片内存空间,指定类型,长度和容量
- arr[start:end:max],由数组或切片创建 其中: 开始索引start,表示从哪个元素开始。 结束索引end,表示到哪个索引终止,不包括该索引元素。 最大索引max,用来确定容量,容量=最大索引-开始索引。默认情况下,最大索引的值为len()。
3 for-range 遍历
for i, v := range sli { fmt.Println(i, v) }
4 append() 扩容
func append(s []T, x ...T) []T 使用 buildin 函数 append() 可以向切片中添加新元素。添加时存在两种情况:
- 切片容量充足,在原切片基础上追加。
- 切片容量不足,会分配新的切片空间来保证已有切片元素和新增元素的存储。
s1 := make([]int, 3, 5) s2 := append(s1, 1, 2) s2[1] = 42 fmt.Println(s1) fmt.Println(s2) // [0 42 0] 修改s2,s1也会更改 // [0 42 0 1 2] s3 := make([]int, 3, 5) s4 := append(s1, 1, 2, 3, 4, 5) s4[1] = 42 fmt.Println(s3) fmt.Println(s4) // [0 0 0] 修改s4,s3不会更改,因为容量不足,开辟了新空间 // [0 42 0 1 2 3 4 5]
可以将一个切片到另一个切片后,需要使用 切片... 来实现:
append(slice1, slice2…)
5 copy() 拷贝切片
由于默认是地址传递赋值方式,当需要得到一个新的拷贝时,需要使用函数copy()来实现。 copy(新切片,旧切片),利用旧切片复制一份新切片。
s3 := []int{10, 20, 30} var s4 = make([]int, 3) copy(s4, s3)
6 常用操作
配合 make,append,copy 可以完成切片的常用操作。
通过索引 i 删除切片中某个元素
s2 := append(s1[:i], s1[i+1:]...)
删除索引 i-j 的元素
s2 := append(append([]int{}, s1[:i]...), s1[j:]...)
在索引 i 的位置插入元素
s2 := append(s1[:i], append([]int{v}, s1[i:]...)...)
在 s1 索引 i 的位置插入切片 s2 的所有元素
s1 = append(s1[:i], append(s2, s1[i:]...)...)
栈操作模拟
// 栈模拟(只在一端的头,添加或者删除元素) var s1 = []int{6, 7, 8, 9, 10, 11} // 操作末尾 // 入栈 s1 = append(s1, 12) fmt.Println(s1) // 出栈 v := s1[len(s1)-1] s1 = s1[:len(s1)-1] fmt.Println(v, s1) // 操作头部 // 入栈 s1 = append([]int{5}, s1...) fmt.Println(s1) // 出栈 v := s1[0] s1 = s1[1:] fmt.Println(v, s1)
队列操作模拟
// 模拟队列 // 头进尾出 var s1 = []int{6, 7, 8, 9, 10, 11} s1 = append([]int{5}, s1...) v := s1[len(s1)-1] s1 = s1[:len(s1)-1] // 尾进头出 var s1 = []int{6, 7, 8, 9, 10, 11} s1 = append(s1, 12) v := s1[0] s1 = s1[1:]
完! 原文出自: 小韩说课
微信关注:小韩说课
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
创投之巅——中国创投精彩案例
投资界网站 / 人民邮电出版社 / 2018-11 / 69.00
中国的科技产业发展,与创投行业密不可分。在过去的几十年间,资本与科技的结合,缔造了众多创业“神话”。回顾这些科技巨头背后的资本路径,可以给如今的国内创业者很多有益的启发。 本书从风险投资回报率、投资周期、利润水平、未来趋势等多个维度,筛选出了我国过去几十年中最具代表性的创业投资案例,对其投资过程和企业成长过程进行复盘和解读,使读者可以清晰地看到优秀创业公司的价值与卓越投资人的投资逻辑。一起来看看 《创投之巅——中国创投精彩案例》 这本书的介绍吧!