当前位置: 首页 > news >正文

Go语言 切片slice

本文内容为Go语言中切片(slice)概念、定义、特性及使用示例。

目录

切片(slice)

定义切片

不设置长度

追加数据

长度与容量

基于数组创建切片

常用切片方式

修改值

总结


切片(slice)

切片:slice,它的底层也是数组,是一种不定长的数组可以动态改变长度。

定义切片

定义一个切片,包含多个城市名称。

示例如下:

package mainimport "fmt"func main() {// 定义一个切片,包含多个城市名称citys := [10]string{"北京", "天津", "上海", "深圳", "重庆"}for key, val := range citys {fmt.Println(key, "=>", val)}
}

打印时除了前五个出现城市名外,其他的都是待填充的,显示空值。

不设置长度

还可以在定义切片时不设置长度。

示例如下:

citys := []string{"北京", "天津", "上海", "深圳", "重庆"}
for key, val := range citys {fmt.Println(key, "=>", val)
}

 

追加数据

在定义好的切片中追加数据。

示例如下:

fmt.Println("追加元素前,citys长度:", citys, ", 容量:", cap(citys))
citys = append(citys, "邯郸")
fmt.Println("追加元素后,citys长度:", citys, ", 容量:", cap(citys))

运行结果:

追加元素前,citys长度: [北京 天津 上海 深圳 重庆] , 容量: 5
追加元素后,citys长度: [北京 天津 上海 深圳 重庆 邯郸] , 容量: 10

长度与容量

对于一个切片,不仅有长度的概念len(),还有一个容量的概念cap()。

示例如下:

nums := []int{}
for i := 0; i < 10; i++ {nums = append(nums, i)fmt.Println("长度:", len(nums), ",容量:", cap(nums))
}

运行结果:

长度: 1 ,容量: 1
长度: 2 ,容量: 2
长度: 3 ,容量: 4
长度: 4 ,容量: 4
长度: 5 ,容量: 8
长度: 6 ,容量: 8
长度: 7 ,容量: 8
长度: 8 ,容量: 8
长度: 9 ,容量: 16
长度: 10 ,容量: 16

说明:切片可以使用append进行追加数据

len获取长度,cap获取容量

如果容量不足,再次追加数据时,会动态分配2倍空间

基于数组创建切片

对数组内容的引用,如果修改切片也会修改数组的值;

数组改变,切片值也会改变。

示例如下:

package mainimport "fmt"func main() {// 基于数组创建切片citys := [7]string{"北京", "天津", "上海", "深圳", "重庆", "开封", "哈尔滨"}// 基于citys创建一个新的数组city1 := [3]string{}city1[0] = citys[0]city1[1] = citys[1]city1[2] = citys[2]fmt.Println("新数组city1:", city1)// 切片可以基于一个数组,灵活的创建新的数组city2 := citys[0:3]fmt.Println("切片city2:", city2)// 数组改变,切片值也会随之修改。citys[0] = "北京1"fmt.Println(city1)fmt.Println(city2)
}

运行结果:

新数组city1: [北京 天津 上海]
切片city2: [北京 天津 上海]
[北京 天津 上海]
[北京1 天津 上海]

 

常用切片方式

如果从0元素开始截取,那么冒号左边的数字可以省略

示例如下:

citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name1 := citys[:3]
fmt.Println(name1)

如果截取到数组最后一个元素,那么冒号右边的数字可以省略

示例如下:

citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name2 := citys[3:6]
fmt.Println(name2)

如果想从左到右全部使用,那么冒号左右两边的数字都可以省略

示例如下:

citys := [10]string{"北京", "天津", "上海", "深圳", "唐山", "石家庄", "秦皇岛", "保定", "邯郸", "邢台"}
name3 := citys[:]
fmt.Println(name3)

也可以基于字符串进行切片截取。

示例如下:

str1 := "helloWorld"[3:5]
fmt.Println(str1) // lo

可以在创建空切片的时候,明确指定切片的容量,这样可以提高运行效率

创建一个容量是20,当前长度是0的string类型切片

示例如下:

str2 := make([]string, 10, 20) // 第三个参数不是必须的,如果没有填写,则默认与长度相同
fmt.Println("str2 长度:", len(str2), ", 容量:", cap(str2))
str2[0] = "hello"
str2[1] = "world"
fmt.Println("str2", str2)

如果想让切片完全的独立于原始数组,可以使用copy()函数实现

示例如下:

cityCopy := make([]string, len(citys))
copy(cityCopy, citys[:])
fmt.Println(cityCopy)

name[:]解释:函数原型接收参数时要求时切片,如果参数为数组,需要转换为切片

修改值

独立于数组的切片值进行修改,不会改变原有数组值。

示例如下:

cityCopy[0] = "呼和浩特"
fmt.Println("cityCopy:", cityCopy)
fmt.Println("citys:", citys)

总结

本文内容为Go语言中切片(slice)概念、定义、特性及使用示例。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mindspore打卡22天之基于MindSpore通过GPT实现情感分类
  • Java---SpringBoot详解一
  • 6.S081的Lab学习——Lab11: Network
  • echarts使用自定义图形实现3D柱状图
  • (day18) leetcode 204.计数质数
  • 如何在idea安装git,使用gitee?
  • Pip换源:加速Python包安装的神操作,你get了吗?
  • Python与自动化脚本编写
  • 7.16做题总结
  • 昇思25天学习打卡营第19天|基于MobileNetv2的垃圾分类
  • LabVIEW阀门运动PCT测试
  • Knife4j的原理及应用详解(五)
  • [图解]SysML和EA建模住宅安全系统-14-黑盒系统规约
  • Python爬虫速成之路(2):爬天气情况
  • 机器学习——决策树(笔记)
  • 分享一款快速APP功能测试工具
  • .pyc 想到的一些问题
  • 2019.2.20 c++ 知识梳理
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • js中forEach回调同异步问题
  • Nacos系列:Nacos的Java SDK使用
  • PAT A1120
  • python 学习笔记 - Queue Pipes,进程间通讯
  • SQLServer之索引简介
  • SwizzleMethod 黑魔法
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 日剧·日综资源集合(建议收藏)
  • 微信小程序设置上一页数据
  • 应用生命周期终极 DevOps 工具包
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (04)odoo视图操作
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (理论篇)httpmoudle和httphandler一览
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)关于pipe()的详细解析
  • *p++,*(p++),*++p,(*p)++区别?
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core 6 redis操作类
  • .net core docker部署教程和细节问题
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core中如何集成RabbitMQ
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET应用架构设计:原则、模式与实践 目录预览
  • ??在JSP中,java和JavaScript如何交互?
  • @EnableConfigurationProperties注解使用
  • @selector(..)警告提示