GO基础之切片
一、什么是切片
Go语言切片是对数组的抽象。
- Go数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组");
- 与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
- 切片本身没有任何数据,它们只是对现有数组的引用。
- 切片与数组相比,不需要设定长度,在[ ]中不用设定值,相对来说比较自由
- 从概念上面来说slice像一个结构体,这个结构体包含了三个元素:
切片的结构:
- 〇指针,指向数组中slice指定的开始位置
- 〇长度,SPslice的长度
- 〇最大长度,也就是slice开始位置到数组的最后位置的长度
二、切片的使用
切片的声明

s1 := make([]int, )
s2 := make([]int, , )
切片的初始化:

nums := []int{, , , , }
len()和cap()函数
1、 切片的长度是切片中元素的数量。
2、 切片的容量是从创建切片的索引开始的底层数组中元素的数量。
3、 切片是可索引的,并且可以由len()方法获取长度,切片提供了计算容量的方 法cap(),可以测量切片最长可以达到多少。[数组计算cap()结果与len()相同]
4、 切片实际的是获取数组的某一部分,len切片<=cap切片<=len数组
package main
import "fmt"
func main() {
s1 := make([]int, )
s2 := make([]int, , )
printSlice(s1) //length:5,cap=5,slice=[0 0 0 0 0]
printSlice(s2) //length:5,cap=7,slice=[0 0 0 0 0]
//创建切片
nums := []int{, , , , }
printSlice(nums)
//从切片中截取小切片
nums1 := nums[:]
printSlice(nums1) //length:3,cap=4,slice=[2 3 4]
nums2 := nums[:]
printSlice(nums2) //length:3,cap=5,slice=[1 2 3]
nums3 := nums[:]
printSlice(nums3) //length:3,cap=3,slice=[3 4 5]
}
func printSlice(slc []int) {
fmt.Printf("length:%d,cap=%d,slice=%v \n", len(slc), cap(slc), slc)
}
三、切片的常用函数
(五)、append( ) 和 copy( )函数
1、函数append( ):
- •往切片中追加新元素
- •可以向 slice里面追加一个或者多个元素,也可以追加一个切片。
- • append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的 其它slice。
- •当使用 append追加元素到切片时,如果容量不够(也就是(cap-len)== 0),Go就会创建一个新的内存地址来储存元素(该方式效率较低)。
2、函数copy:*复制切片元素
- •将源切片中的元素复制到目标切片中,返回复制的元素的个数
- • copy方法是不会建立源切片与目标切片之间的联系。也就是两个切片不存 在联系,一个修改不影响另一个。
package main
import "fmt"
func main() {
//创建切片
nums := []int{, , , , }
printSlice("nums", nums) //slice=nums,p=0xc00000c5d0,length:5,cap=5,slice=[1 2 3 4 5]
//append 追加元素
nums = append(nums, )
printSlice("nums", nums) //slice=nums,p=0xc000014230,length:6,cap=10,slice=[1 2 3 4 5 10]
a := []int{, , , }
//追加数组
nums = append(nums, a...)
printSlice("nums", nums) //slice=nums,p=0xc000014230,length:10,cap=10,slice=[1 2 3 4 5 10 6 7 8 9]
//删除第一个元素
nums = nums[:]
printSlice("nums", nums) //slice=nums,p=0xc000014238,length:9,cap=9,slice=[2 3 4 5 10 6 7 8 9]
//删除最后一个元素
nums = nums[:len(nums)-]
printSlice("nums", nums) //slice=nums,p=0xc000014238,length:8,cap=9,slice=[2 3 4 5 10 6 7 8]
//删除中间的元素
b := int(len(nums) / )
nums = append(nums[:b], nums[b+:]...)
printSlice("nums", nums) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
//切片copy
nums2 := make([]int, len(nums), cap(nums)*)
//copy 的切片没有关联
copy(nums2, nums)
printSlice("nums2", nums2) //slice=nums,p=0xc000014238,length:7,cap=9,slice=[2 3 4 5 6 7 8]
}
func printSlice(name string, slc []int) {
fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
3、使用make创建切片
package main import "fmt"
import "strconv" func main() {
str := make([]string, , )
printSlice("str", str)
for i := ; i < ; i++ {
str = append(str, strconv.Itoa(i))
}
printSlice("str", str) }
func printSlice(name string, slc []string) {
fmt.Printf("slice=%v,p=%p,length:%d,cap=%d,slice=%v \n", name, slc, len(slc), cap(slc), slc)
}
GO基础之切片的更多相关文章
- Go语言基础之切片
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
- GoLang基础数据类型-切片(slice)详解
GoLang基础数据类型-切片(slice)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数组的长度在定义之后无法再次修改:数组是值类型,每次传递都将产生一份副本.显然这种数 ...
- GO学习-(9) Go语言基础之切片
Go语言基础之切片 本文主要介绍Go语言中切片(slice)及它的基本使用. 引子 因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. 例如: func arraySum(x ...
- golang基础---Slice切片
切片Slice在go语言中是单独的类型(指向底层的数组),不同于python(对可迭代对象操作的工具),注意区分数组和slice的区别 定义一个空slice,格式var s []int,这种既没有长度 ...
- Python基础3切片,字符串的方法
切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...
- Python基础(切片,list循环,元组)
list和字符串循环: 切片:list取值的一种方式,同样适用于字符串(因为字符串也有下标) 不可变类型:元组,字符串
- Python基础3切片,字符串的方法,for 循环
切片:截取序列(字符串,列表,元组等)中某一段字符,并不改变原数据和数据类型.结构:[起始位置:终止位置:步长] 但不包括终止位置.所谓:顾头不顾尾. 索引:序列中每个元素都是有编号的,都是从0开始 ...
- go语言基础之切片做函数参数
1.切片做函数参数 (备注:用了冒泡排序) 示例: package main //必须有个main包 import "fmt" import "math/rand&quo ...
- go语言基础之切片和底层数组关系
1.切片和底层数组关系 示例: package main //必须有个main包 import "fmt" func main() { a := []int{0, 1, 2, 3, ...
- go语言基础之切片的创建和截取
1.切片的创建 示例: package main //必须有个main包 import "fmt" func main() { //切片和数组的区别 //数组[]里面的长度时固定的 ...
随机推荐
- JS---案例:美女时钟
案例:美女时钟 思路: 打开页面就有图片按每秒1张的顺序轮换,用到了日期对象,获取小时和秒. 封装到一个命名函数后,为了使页面打卡就有图片的轮换,先调用下f1,再设置setInterval <! ...
- 墨者 - X-FORWARDED-FOR注入漏洞实战
X-FORWARDED-FOR 首先,X-Forwarded-For 是一个 HTTP 扩展头部.HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引 ...
- Linux下利用coredump技术追查进程崩溃原因
原文链接:https://blog.csdn.net/u014585564/article/details/68063269 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了cored ...
- Pikachu-Sql Inject
Pikachu-Sql Inject 在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞. 一个严重的SQL注入漏洞,可能会直接导致一 ...
- 全文检索--Lucene & ElasticSearch
全文检索--Lucene 2.1 全文检索和以前高级查询的比较 1.高级查询 缺点:1.like让数据库索引失效 2.每次查询都是查询数据库 ,如果访问的人比较多,压力也是比较大 2.全文检索框架:A ...
- 你竟然没用 Nuget 构建项目?
想写这篇文章缘起于公众号文章里的一条留言: 对于一个现代化的开发平台,建立一种让开发者创建,分享与使用可复用代码的机制是十分必要的.这种"可复用代码"被打包后的文件通常被称作&qu ...
- ASP.NET Core on K8S深入学习(11)K8S网络知多少
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Kubernetes网络模型 我们都知道Kubernetes作为容器编排引 ...
- Cross-Site Scripting:DOM 跨站点脚本:DOM
- 高级Java开发人员最常访问的几个网站
这是高级Java开发人员最常访问的几个网站. 这些网站提供新闻,一般问题或面试问题的答案,精彩的讲座等.质量是优秀网站的关键因素,这此网站都有较高的质量内容.下面逐一介绍: 1. Stackoverf ...
- Dubbo学习系列之六(微服务架构实战)
看了最近文章的反馈,似乎波澜不惊的样子,应该是看官觉得都是小菜,那我就直上硬菜,人狠话不多,开始!准备:Idea201902/JDK11/ZK3.5.5/Gradle5.4.1/RabbitMQ3.7 ...