Go学习(十)切片
1。切片的概念
Go语言中数组的长度不可改变,但在很多应用场景中,在初始定义数组时,数组的长度并不可预知,这样的序列集合无法满足要求。Go中提供了另外一种内置类型切片(slice),弥补了数组的缺陷。从底层来看,切片引用了数组的对象。切片可以追加元素,在追加时可能使切片的容量增大。与数组相比,切片不需要设定长度,在〔〕中不用设定值,相对来说比较自由。2。切片声明使用2。1通过make使用make()函数来创建切片varslice1make(〔〕int,3)slice1〔0〕1slice1〔1〕2slice1〔2〕4fmt。Printf(通过make关键字〔slic1〕类型:T值:v,slice1,slice1)输出:通过make关键字〔slic1〕类型:〔〕int值:〔124〕2。2直接初始化直接初始化使用slice2:〔〕int{1,2,4}fmt。Printf(直接初始化使用〔slic2〕类型:T值:v,slice2,slice2)输出:直接初始化使用〔slic2〕类型:〔〕int值:〔124〕2。3通过数组截取packagemainimportfmtfuncmain(){定义一个数组arr:〔。。。〕int{1,2,4,6,8,10,12,14,16}从索引0开始截取到索引为4(不包括4)slice3:arr〔0:4〕fmt。Printf(从索引0开始截取到索引为4(不包括4)〔slice3〕类型:T值:v,slice3,slice3)索引从0开始时,0也可以省略不写slice33:arr〔:4〕fmt。Printf(从索引0开始截取到索引为4(不包括4)〔slice33〕类型:T值:v,slice33,slice33)从索引4开始截取到最后slice4:arr〔5:〕fmt。Printf(从索引5开始截取到最后〔slice4〕类型:T值:v,slice4,slice4)}输出从索引0开始截取到索引为4(不包括4)〔slice3〕类型:〔〕int值:〔1246〕从索引0开始截取到索引为4(不包括4)〔slice33〕类型:〔〕int值:〔1246〕从索引5开始截取到最后〔slice4〕类型:〔〕int值:〔10121416〕3。切片删除3。1删除第一个元素packagemainimportfmtfuncmain(){定义一个切片slice:〔〕int{1,2,3,4,5,6}fmt。Printf(切片slice值:vlen:dcap:d,slice,len(slice),cap(slice))删除第一个元素sliceslice〔1:〕fmt。Printf(删除一个元素后值:vlen:dcap:d,slice,len(slice),cap(slice))}输出切片slice值:〔123456〕len:6cap:6删除一个元素后值:〔23456〕len:5cap:53。2删除最后一个元素packagemainimportfmtfuncmain(){定义一个切片slice:〔〕int{1,2,3,4,5,6}fmt。Printf(切片slice值:vlen:dcap:d,slice,len(slice),cap(slice))删除最后一个元素sliceslice〔:len(slice)1〕fmt。Printf(删除一个元素后值:vlen:dcap:d,slice,len(slice),cap(slice))}输出切片slice值:〔123456〕len:6cap:6删除一个元素后值:〔12345〕len:5cap:63。3删除指定位置元素packagemainimportfmtfuncmain(){定义一个切片slice:〔〕int{1,2,3,4}fmt。Printf(切片slice值:vlen:dcap:d,slice,len(slice),cap(slice))index:2指定索引前面一部分front:slice〔:index〕指定索引后面一部分behind:slice〔index1:〕拼起来sliceappend(front,behind。。。)fmt。Printf(删除索引d后值:vlen:dcap:d,index,slice,len(slice),cap(slice))}4。len()和cap()4。1作用
切片的长度是切片中元素的数量。切片的容量是从创建切片的索引开始的底层数组中元素的数量。切片可以通过len()方法获取长度,可以通过cap()方法获取容量。数组计算cap()结果与len()相同。4。2使用packagemainimportfmtfuncmain(){创建一个切片slice:〔〕int{1,2,4,6,8,10,12,14,16}fmt。Printf(切片slice,len:dcap:d,len(slice),cap(slice))清空切片slice赋值给slice1slice1:slice〔0:0〕fmt。Printf(切片slice1,len:dcap:d,len(slice1),cap(slice1))使用make指定容量创建切片varslice2make(〔〕int,4,8)slice2〔1〕1slice2〔3〕3fmt。Printf(切片slice2,len:dcap:d,len(slice2),cap(slice2))数组计算cap()结果与len()相同arr:〔。。。〕int{1,2,4,6,8,10,12,14,16}fmt。Printf(数组arr,len:dcap:d,len(arr),cap(arr))}输出:切片slice,len:9cap:9切片slice1,len:0cap:9切片slice2,len:4cap:8数组arr,len:9cap:95。切片是引用类型
切片没有自己的任何数据。它只是底层数组的一个引用。对切片所做的任何修改都将反映在底层数组中。数组是值类型,而切片是引用类型。5。1函数传参packagemainimportfmtfunctestSlice(slice〔〕int){修改切片的值slice〔0〕100}funcmain(){创建一个切片varslicemake(〔〕int,4,4)slice〔〕int{1,2,3,4}fmt。Printf(变量slice类型:T内存地址:p值:v,slice,slice,slice)调用函数修改testSlice(slice)fmt。Printf(调用函数后,变量slice类型:T内存地址:p值:v,slice,slice,slice)}输出变量slice类型:〔〕int内存地址:0xc00000c080值:〔1234〕调用函数后,变量slice类型:〔〕int内存地址:0xc00000c080值:〔100234〕5。2多切片共享
修改切片数值,当多个切片共享相同的底层数组时,对每个元素所做的更改将在数组中反映出来。packagemainimportfmtfunctestSlice(slice〔〕int){修改切片的值slice〔0〕100}funcmain(){创建一个切片varslicemake(〔〕int,4,4)slice〔〕int{1,2,3,4}fmt。Printf(变量slice类型:T内存地址:p值:v,slice,slice,slice)复制给另外一个切片sliceCopy:slicefmt。Printf(变量sliceCopy类型:T内存地址:p值:v,sliceCopy,sliceCopy,sliceCopy)从切片中截取slice2:slice〔0:2〕fmt。Printf(变量slice2类型:T内存地址:p值:v,slice2,slice2,slice2)调用函数修改testSlice(slice)fmt。Printf(调用函数后变量slice类型:T内存地址:p值:v,slice,slice,slice)fmt。Printf(调用函数后变量sliceCopy类型:T内存地址:p值:v,sliceCopy,sliceCopy,sliceCopy)fmt。Printf(调用函数后变量slice2类型:T内存地址:p值:v,slice2,slice2,slice2)}6。append()和copy()6。1作用append():用于往切片中追加新元素,可以向切片里面追加一个或者多个元素,也可以追加一个切片。copy():不会建立源切片与目标切片之间的联系。也就是两个切片不存在联系,其中一个修改不影响另一个。6。2使用append()packagemainimportfmtfunctestSlice(slice〔〕int){修改切片的值slice〔0〕100}funcmain(){定义一个切片类型,长度为0,容量为4varslicemake(〔〕int,0,4)向切片中添加1个元素(不超过容量)slice1:append(slice,1)fmt。Printf(变量slice1值:v长度(len):d容量(cap):d地址:p,slice1,len(slice1),cap(slice1),slice1)向切片中添加多个元素(不超过容量)slice2:append(slice,3,4,5)fmt。Printf(变量slice2值:v长度(len):d容量(cap):d地址:p,slice2,len(slice2),cap(slice2),slice2)向切片中添加一个切片(超过容量)newSlice:〔〕int{1,2,3,4,5,6,7}slice3:append(slice,newSlice〔:〕。。。)fmt。Printf(变量slice3值:v长度(len):d容量(cap):d地址:p,slice3,len(slice3),cap(slice3),slice3)调用函数修改testSlice(slice1)fmt。Printf(调用函数后变量slice1值:v长度(len):d容量(cap):d地址:p,slice1,len(slice1),cap(slice1),slice1)fmt。Printf(调用函数后变量slice2值:v长度(len):d容量(cap):d地址:p,slice2,len(slice2),cap(slice2),slice2)fmt。Printf(调用函数后变量slice3值:v长度(len):d容量(cap):d地址:p,slice3,len(slice3),cap(slice3),slice3)}输出变量slice1值:〔1〕长度(len):1容量(cap):4地址:0xc00000c080变量slice2值:〔345〕长度(len):3容量(cap):4地址:0xc00000c0c0变量slice3值:〔1234567〕长度(len):7容量(cap):8地址:0xc00000c100调用函数后变量slice1值:〔100〕长度(len):1容量(cap):4地址:0xc00000c080调用函数后变量slice2值:〔10045〕长度(len):3容量(cap):4地址:0xc00000c0c0调用函数后变量slice3值:〔1234567〕长度(len):7容量(cap):8地址:0xc00000c100
append()会改变切片所引用的数组的内容,从而影响到引用同一数组的其他切片。当使用append()追加元素到切片时,如果容量不够(也就是(caplen)0),Go就会创建一个新的内存地址来储存元素。6。3使用copy()packagemainimportfmtfuncmain(){定义一个切片slice:〔〕int{1,2,3,4}fmt。Printf(变量slice值:v长度(len):d容量(cap):d地址:p,slice,len(slice),cap(slice),slice)定义一个切片变量用来复制slicecopySlice:make(〔〕int,8)使用copycount:copy(copySlice,slice)fmt。Printf(复制的数量:d,count)fmt。Printf(变量copySlice值:v长度(len):d容量(cap):d地址:p,copySlice,len(copySlice),cap(copySlice),Slice)修改复制后的切片,源切片不会变copySlice〔0〕100fmt。Printf(修改后变量slice值:v长度(len):d容量(cap):d地址:p,slice,len(slice),cap(slice),slice)fmt。Printf(修改后变量copySlice值:v长度(len):d容量(cap):d地址:p,copySlice,len(copySlice),cap(copySlice),Slice)}输出变量slice值:〔1234〕长度(len):4容量(cap):4地址:0xc00000c080复制的数量:4变量copySlice值:〔12340000〕长度(len):8容量(cap):8地址:0xc00000c0c0修改后变量slice值:〔1234〕长度(len):4容量(cap):4地址:0xc00000c080修改后变量copySlice值:〔1002340000〕长度(len):8容量(cap):8地址:0xc00000c0c0
微信搜索【猿码记】,获取最新文章信息。〔得意〕
佳能单反相机停产说明了什么?与同行竟争的一种策略,凭着强大的优势,给竟争者来个吓马威。在单反领域始终是排头兵的隹能,生产微单那都不是事儿。日本相机行业的三足鼎立,必将一争。前天刚买了一个新手机,拍出……
被批吃相难看!微信拟推出聊天记录付费云存储服务遭吐槽作为一名苦逼的社畜,微信公司群里聊天不敢错过,聊天记录不敢随便删除,就怕哪一天突然要用到,结果一看手机储存容量,微信占据了数十个G。于是,现在越来越多人买手机时较为看重的……
为什么阿里不做搜索引擎?阿里是一直在做搜索引擎的,只不过阿里做搜索不叫阿里搜索,但是这并不代表阿里就没有做搜索引擎,比如神马搜索、夸克搜索(夸克浏览器自带搜索引擎)、比如针对性的淘宝商品搜索,1688……
选择新能源我只认背景强大的上汽新能源我只认背景强大的厂家上汽。上汽集团是中国汽车界的No。1,非凡汽车是上汽集团打造的中高端智能纯电汽车品牌,目前有2款车型。若论续航,当属飞凡MARVELR,它实现NEDC……
Top10丨突破100KM长续航的电动车品牌,你更看好谁?电动车已经不仅仅是代步工具,锂电化、智能化的升级,让人们对于电动车寄予了更多期待。其中,续航是电动车用户一直以来最关注的点,在巅峰时期,国内电动车品牌曾高达3000,到底哪些品……
为什么国内的大厂不愿意适配Linux软件,技术实现上很难吗?当然是不愿意,故意的,因为大家看到有QQFORLINUX,但是功能很鸡肋,没法用。技术上不是什么问题,而是限制阻止,应该是不可告人目的。你说的apipost是什么东西,web接……
电商实体店,强强联手,共赢才能共生任何红利都有消失的一天,电商也不例外。在同质化加剧,拼价格的电商平台,由于门槛低,鱼龙混杂,产品质量售后服务等参差不齐,严重影响消费者的购买体验,导致其逐渐对电商平台失去……
扬杰科技(300373。SZ)拟对外投资引入外部团队共同开发智通财经APP讯,扬杰科技(300373。SZ)发布公告,为了进一步深化行业布局,实现公司的战略发展目标,该公司拟与徐小兵先生、杨兵先生签订合作协议,共同投资设立无锡杰矽微半导……
元宇宙到底是个啥全世界似乎都在谈元宇宙。到底什么是元宇宙?它为什么突然火了?它离我们还有多远?比拼想象力的时候到了什么是元宇宙?截至目前,还没有一个被广泛认可的确切定义,人们对它的……
吉林省启动赋予科研人员职务科技成果所有权或长期使用权试点记者从省科技厅了解到,我省已启动赋予科研人员职务科技成果所有权或长期使用权试点工作,将职务科技成果所有权由单位所有变为单位与职务科技成果完成人(团队)可以约定所有,促进科技成果……
华为加持!续航突破1000公里!零百只要4秒多!随着大家环保意识的提高,对新能源汽车也越来越重视,很多用户也开始选择新能源汽车作为家庭用车,赛力斯华为智选SF5更是用户更优质的选择。从外观来看,赛力斯华为智选SF5绝对……
565km续航超ModelY!这样的极星2谁不怕失而复得的第二十四届成都车展,赶在第三季度的尾梢正式开幕,仅延后两天的操作不仅让参会展商少了整天卖车的周末,匆忙的复工节奏也令不少车企的准备颇为慌乱。在这场主题已经被模糊……