Go的切片
切片
切片是由数组建立的一种方便、灵活且功能强大的包装(Wrapper)。切片本身不拥有任何数据。它们只是对现有数组的引用。
因此切片的类型是引用类型。
一、切片的创建
1、先创建数组,再引用
// 先创建一个数组
var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
// 创建切片
var sli = lis[:] // 从头到尾全切
fmt.Println(sli) // [1 2 3 4 5 6 7 8 9 10]
fmt.Printf("%T",sli) // []int
// []内没有数字就是切片,有就是数组
2、直接创建切片
var a []int=[]int{1,2,3,4,5} //切片初始化,类似于数组初始化
二、切片的修改
因为切片是引用类型,它是对数组的引用。所以切片的修改会影响原来的数组,数组的修改也会影响切片。
var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
var b []int = lis[5:9] // 索引取值,左开右闭
b[0]=999
lis[6]=888
fmt.Println(b)
fmt.Println(lis)
[999 888 8 9]
[1 2 3 4 5 999 888 8 9 10]
三、切片的长度和容量
len() :长度,现在有多少值
cap() :容量,总共能放多少值,为引用的数组长度-切片首位索引
var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
var b []int = lis[5:9]
fmt.Println(len(b)) // 4
fmt.Println(cap(b)) // 5 //(10-5)
四、使用make创建切片
用函数make([]T,len,cap)来创建切片类型的变量,就不用先创建数组了。
函数参数分别为:类型,长度和容量。
容量是可选参数, 默认值为切片长度。
make 函数原理为创建一个数组,并返回引用该数组的切片。
var sli []int=make([]int,3,4)
fmt.Println(len(sli)) // 3
fmt.Println(cap(sli)) // 4
五、切片的修改和追加
1、修改
像列表一样用[索引]取值,修改值。
var a []int=make([]int,3,4)
a[0]=999
a[2]=999 //切片用[]修改值,只能取最大长度修改,超出长度的容量不能用[]的方式取值修改
a[3]=100 // 不行!!!会报错
2、追加:append
使用函数 append(slice []T,x ... T)[]T 可以将新元素追加到切片上。它会有一个返回值,是追加后的新的切片,所以需要用一个值来接受一下。
var sli []int=make([]int,3,4)
sli = append(sli,444)
fmt.Println(len(sli)) // 4
fmt.Println(cap(sli)) // 4
如果append函数添加的值,使切片长度超过最大容量,则会创建一个新的底层数组取代原本切片引用的数组。
原切片的元素被复制到这个新数组中,并返回引用这个新数组的切片。
这个新数组的长度是旧切片容量的两倍。而新切片的容量就等于这个新数组的长度。
所以现在新切片的容量是旧切片的两倍。
此时修改新切片的元素就不会影响原数组了。
// make创建的切片的追加
var sli []int=make([]int,3,4)
fmt.Println(len(sli)) // 3
fmt.Println(cap(sli)) // 4
sli = append(sli,444)
fmt.Println(len(sli)) // 4
fmt.Println(cap(sli)) // 4
sli = append(sli,555)
fmt.Println(sli) // [0 0 0 444 555]
fmt.Println(len(sli)) // 5
fmt.Println(cap(sli)) // 8
// 引用数组的切片的追加
var lis [10]int= [10]int{1,2,3,4,5,6,7,8,9,10}
var sli []int = lis[5:9]
fmt.Println(lis) // [1 2 3 4 5 6 7 8 9 10]
fmt.Println(sli) // [6 7 8 9]
fmt.Println(len(sli)) // 4
fmt.Println(cap(sli)) // 5
sli = append(sli,444)
sli[2] = 888 // 切片影响原来的数组
fmt.Println(lis) // [1 2 3 4 5 6 7 888 9 444]
fmt.Println(sli) // [6 7 888 9 444]
fmt.Println(len(sli)) // 5
fmt.Println(cap(sli)) // 5
sli = append(sli,555)
sli[1] = 777 // 新的切片不会影响原来的数组了
fmt.Println(lis) // [1 2 3 4 5 6 7 888 9 444]
fmt.Println(sli) // [6 777 888 9 444 555]
fmt.Println(len(sli)) // 6
fmt.Println(cap(sli)) // 10 新切片的容量是旧切片的两倍
六、切片的函数传值
因为切片的类型是引用类型,因此传值后,改变值会影响原来的值。
var a []int=make([]int,4,5)
fmt.Println(a) // [0 0 0 0]
test2(a) // [111 0 0 0]
// [111 0 0 0 555]
fmt.Println(a) // [111 0 0 0]
func test2(x []int) {
x[0] = 111 // 修改a变量地址里的值
fmt.Println(x) // [111 0 0 0]
x = append(x,555) // copy的x的长度变化了,产生了新的切片
fmt.Println(x) // [111 0 0 0 555]
}
七、多维切片
一般直接初始化。
var a [][]int=[][]int{{1,2,3},{2,3},{4,5,5,6,7,8,9}}
fmt.Println(a) // [[1 2 3] [2 3] [4 5 5 6 7 8 9]]
八、切片的copy
把一个切片的元素copy到另一个切片上。
用函数copy(dst(目标), src(源))。
var a []int=make([]int,4,5)
var b []int =[]int{1,2,3,4,5}
fmt.Println(a) // [0 0 0 0]
fmt.Println(b) // [1 2 3 4 5]
//把b的数据copy到a上
copy(a,b)
fmt.Println(a) // [1 2 3 4] // 长度有多少就接受多少
fmt.Println(b) // [1 2 3 4 5]
--------------------------------------------------
var a []int=make([]int,6,7)
var b []int =[]int{1,2,3,4,5}
fmt.Println(a) // [0 0 0 0 0 0]
fmt.Println(b) // [1 2 3 4 5]
//把b的数据copy到a上
copy(a,b)
fmt.Println(a) // [1 2 3 4 5 0] // 不足的用默认值补齐
fmt.Println(b) // [1 2 3 4 5]
Go的切片的更多相关文章
- ArcGIS 10.0紧凑型切片读写方法
首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...
- 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片
概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...
- 充电时间 Go中的数组、切片、map简单示例
数组是固定长度的,依稀让我想起了VB:切片是动态的:map一般是键值对 package main import ( "fmt" ) func main() { var userna ...
- GO语言总结(3)——数组和切片
上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...
- [LeetCode] Arithmetic Slices 算数切片
A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...
- 网络切片在5G中的应用
SDNLAB君 • 16-11-25 •1509 人围观 5G和网络切片 当5G被广泛提及的时候,网络切片是其中讨论最多的技术.像KT.SK Telecom.China Mobile.DT.KDDI. ...
- KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 使用KRPano资源分析工具强力加密KRPano项目(XML防破解,切片图保护,JS反调试)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 使用KRPano资源分析工具一键下载全景网站切片图
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
随机推荐
- .NET 微服务
前文传送门: 什么是云原生? 现代云原生设计理念 Microservices 微服务是构建现代应用程序的一种流行的体系结构样式,云原生系统拥抱微服务. 微服务是由一组(使用共享结构交互的.独立的小块服 ...
- mysql查询太慢,我们如何进行性能优化?
老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...
- 1155 Heap Paths
题干前半略. Sample Input 1: 8 98 72 86 60 65 12 23 50 Sample Output 1: 98 86 23 98 86 12 98 72 65 98 72 ...
- AtCoder Beginner Contest 176 E - Bomber (思维)
题意:有一张\(H\)x\(W\)的图,给你\(M\)个目标的位置,你可以在图中放置一枚炸弹,炸弹可以摧毁所在的那一行和一列,问最多可以摧毁多少目标. 题解:首先我们记录某一行和某一列目标最多的数目, ...
- 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
题意:给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17) 解法:1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子树 ...
- hdu2157 How many ways??
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission ...
- AcWing 238.银河英雄传说 (边带权并查集)
题意:有\(n\)列,有\(T\)条指令,若指令格式为\(M\),则将第\(i\)号的所有战舰移到第\(j\)号所在列的后面,若指令格式为\(C\),询问\(i\)和\(j\)是否在同一列,如果在,问 ...
- 01背包记录路径 (例题 L3-001 凑零钱 (30分))
题意: 就是找出来一个字典序最小的硬币集合,且这个硬币集合里面所有硬币的值的和等于题目中的M 题解: 01背包加一下记录路径,如果1硬币不止一个,那我们也不采用多重背包的方式,把每一个1硬币当成一个独 ...
- 创建java文件和注释
创建java文件和注释 一 创建java文件 在文件夹里创建txt文本文件,后将格式改为.java, 输入 1 public class Hello{ 2 public static void mai ...
- spark 一、编程指南
总览 第一.每个spark 应用都有一个驱动程序去运行着主函数和再每个节点上的并行操作. spark提供了一个RDD(弹性分布式数据集)的数据集合,可以通过不同的节点并行操作运算,可以通过hdfs文件 ...