这篇文章主要介绍了Golang中的切片怎么定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang中的切片怎么定义使用文章都会有所收获,下面我们一起来看看吧。从上一节我们知道,因为数组的长度是固定的并且数组长度属于类型的一部分,数组a中已经有三个元素了,我们不能再继续往数组a中添加新元素了。那在js中我们往数组里面添加元素等操作是很正常的,那go怎么办呢?这就会引入的们今天的重点-切片。切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型,它的内部结构包含地址
、长度
和容量
。切片一般用于快速地操作一块数据集合。声明切片类型的基本语法如下:
varname[]T
其中,name:表示变量名T:表示切片中的元素类型
funcmain(){ //声明切片类型 vara[]string//声明一个字符串切片 varb=[]int{}//声明一个整型切片并初始化 varc=[]bool{false,true}//声明一个布尔切片并初始化 vard=[]bool{false,true}//声明一个布尔切片并初始化 fmt.Println(a)//[] fmt.Println(b)//[] fmt.Println(c)//[falsetrue] fmt.Println(a==nil)//true fmt.Println(b==nil)//false fmt.Println(c==nil)//false //fmt.Println(c==d)//切片是引用类型,不支持直接比较,只能和nil比较 }
切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low
和high
表示一个索引范围(左包含,右不包含),也就是下面代码中从数组a中选出1的元素组成切片s,得到的切片
长度=high-low
,容量等于得到的切片的底层数组的容量。
funcmain(){ a:=[5]int{1,2,3,4,5} s:=a[1:3]//s:=a[low:high] fmt.Printf("s:%vlen(s):%vcap(s):%vn"免费云主机域名,s,len(s),cap(s)) } 输出: a[2:]//等同于a[2:len(a)] a[:3]//等同于a[0:3] a[:]//等同于a[0:len(a)]
对于数组,指向数组的指针,或切片a(注意不能是字符串)支持完整切片表达式
a[low:high:max]
上面的代码会构造与简单切片表达式a[low: high]
相同类型、相同长度和元素的切片。另外,它会将得到的结果切片的容量设置为max-low
。在完整切片表达式中只有第一个索引值(low)可以省略;它默认为0。
funcmain(){ a:=[5]int{1,2,3,4,5} t:=a[1:3:5] fmt.Printf("t:%vlen(t):%vcap(t):%vn",t,len(t),cap(t)) } 输出: t:[23]len(t):2cap(t):4
完整切片表达式需要满足的条件是0 ,其他条件和简单切片表达式相同。
我们上面都是基于数组来创建的切片,如果需要动态的创建一个切片,我们就需要使用内置的make()
函数,格式如下:
make([]T,size,cap)
其中:T:切片的元素类型size:切片中元素的数量cap:切片的容量
funcmain(){ a:=make([]int,2,10) fmt.Println(a)//[00] fmt.Println(len(a))//2 fmt.Println(cap(a))//10 }
上面代码中a
的内部存储空间已经分配了10个,但实际上只用了2个。 容量并不会影响当前元素的个数,所以len(a)
返回2,cap(a)
则返回该切片的容量。切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。切片之间是不能比较的,我们不能使用==
操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil
比较。 一个nil
值的切片并没有底层数组,一个nil
值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil
,例如下面的示例:
vars1[]int//len(s1)=0;cap(s1)=0;s1==nil s2:=[]int{}//len(s2)=0;cap(s2)=0;s2!=nil s3:=make([]int,0)//len(s3)=0;cap(s3)=0;s3!=nil
要检查切片是否为空,请始终使用len(s) == 0
来判断,而不应该使用s == nil
来判断。拷贝前后两个变量共享底层数组,对一个切片的修改会影响另一个切片的内容,这点需要特别注意。
funcmain(){ s1:=make([]int,3)//[000] s2:=s1//将s1直接赋值给s2,s1和s2共用一个底层数组 s2[0]=100 fmt.Println(s1)//[10000] fmt.Println(s2)//[10000] }
切片的遍历方式和数组是一致的,支持索引遍历和for range
遍历。
funcmain(){ s:=[]int{1,3,5} fori:=0;i
Go语言的内建函数append()
可以为切片动态添加元素。 可以一次添加一个元素,可以添加多个元素,也可以添加另一个切片中的元素(后面加…)。
funcmain(){ vars[]int s=append(s,1)//[1] s=append(s,2,3,4)//[1234] s2:=[]int{5,6,7} s=append(s,s2...)//[1234567] }
通过var声明的零值切片可以在append()
函数直接使用,无需初始化。
vars[]ints=append(s,1,2,3)
每个切片会指向一个底层数组,这个数组的容量够用就添加新增元素。当底层数组不能容纳新增的元素时,切片就会自动按照一定的策略进行“扩容”,此时该切片指向的底层数组就会更换。“扩容”操作往往发生在append()
函数调用时,所以我们通常都需要用原变量接收append函数的返回值。由于切片是引用类型,所以a和b其实都指向了同一块内存地址。修改b的同时a的值也会发生变化。
funcmain(){ a:=[]int{1,2,3,4,5} b:=a fmt.Println(a)//[12345] fmt.Println(b)//[12345] b[0]=1000 fmt.Println(a)//[10002345] fmt.Println(b)//[10002345] }
Go语言内建的copy()
函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()
函数的使用格式如下:
copy(destSlice,srcSlice[]T)
其中:srcSlice: 数据来源切片destSlice: 目标切片
funcmain(){ //copy()复制切片 a:=[]int{1,2,3,4,5} c:=make([]int,5,5) copy(c,a)//使用copy()函数将切片a中的元素复制到切片c fmt.Println(a)//[12345] fmt.Println(c)//[12345] c[0]=1000 fmt.Println(a)//[12345] fmt.Println(c)//[10002345] }
Go语言中并没有删除切片元素的专用方法,我们可以使用切片本身的特性来删除元素。
funcmain(){ //从切片中删除元素 a:=[]int{30,31,32,33,34,35,36,37} //要删除索引为2的元素 a=append(a[:2],a[3:]...) fmt.Println(a)//[30313334353637] }
要从切片a中删除索引为index
的元素,操作方法是a = append(a[:index], a[index+1:]...)
关于“Golang中的切片怎么定义使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Golang中的切片怎么定义使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
相关推荐: RestTemplate Get请求如何实现bean参数传递
今天小编给大家分享一下RestTemplateGet请求如何实现bean参数传递的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Spring 的 …
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。