Go数据类型之复合数据类型--Slice
3.2 Slice
一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。
一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素
并不一定就是数组的第一个元素。长度对应slice中元素的数目;长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。
内置的len和cap函数分别返回slice的长度和容量。多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠。
3.2.1 创建Slice
1、make
使用make时,需要传入一个参数,指定切片的长度。
slice := make([]string, 5) //创建一个字符串切片,长度和容量都是5个元素
slice := make([]string, 3, 5) //创建一个字符串切片,长度为3,容量为5
2、切片字面量来声明切片
slice := []int{10, 20, 30} //创建一个整型切片,长度和容量都是3个元素
slice := []string{99: “”} //创建字符串切片,使用空字符串初始化第100个元素
3、nil切片
nil在底层数组包含0个元素,也没有分配任何存储空间,长度为0,容量为0。
var slice []int //创建nil整形切片
slice := make([]int, 0) //使用make创建空的整型切片
slice := []int{} //使用切面字面量创建空的整形切片
3.2.2 使用切片
1、赋值和切片
//创建一个整形切片
slice := []int{10, 20, 30, 40, 50}
//创建一个新切片,长度为2,容量为4(从索引1开始,之前的元素对它而言不存在)
newSlice := slice[1:3]
对底层数组容量是k的切片slice[i:j]来说:
长度: j – i
容量: k – I
2、使用append向切片增加元素
请看下面代码:
package main import "fmt" func main() {
//创建一个整形切片
slice := []int{10, 20, 30, 40, 50}
fmt.Println("slice is:", slice) //创建一个新切片,长度为2,容量为4
newSlice := slice[1:3]
fmt.Println("newSlice is:",newSlice) //对newSlice追加新元素,长度为3,容量为4
newSlice = append(newSlice, 60)
fmt.Println("newSlice append is:", newSlice) fmt.Println("now slice is:", slice)
}
运行结果:
slice is: [10 20 30 40 50]
newSlice is: [20 30]
newSlice append is: [20 30 60]
now slice is: [10 20 30 60 50]
slice和newSlice共享同一段底层数组,newSlice是从索引1的位置开始,因此对newSlice进行append时,其实是修改slice的第四个数值,从打印结果我们也可以得出这样的结论。
slice和newSlice共享同一段底层数组,但通过不同的切片会看到底层数组的不同部分。如果一个切片修改了该底层数组的共享部分,另一个切片也能感知到。
Go数据类型之复合数据类型--Slice的更多相关文章
- Go数据类型之复合数据类型--数组
3.1数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成.数组中每个元素类型相同,又是连续分配,因此可以以固定的速度索引数组中的任何数据,速度非常快. 3.1.1声明 ...
- [日常] Go语言圣经--复合数据类型,数组习题
go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...
- Go语言入门篇-复合数据类型
复合数据类型 主要讨论四种类型——数组.slice.map和结构体 数组和结构体聚合类型 --数组和结构体都是有固定内存大小的数据结构 --数组:由同构的元素组成——每个数组元素都是完全相同的类型 ...
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- 【Oracle】Oracle中复合数据类型
1,常见的操作数据库的技术有那些 jdbc 使用java 访问数据库的技术 PLSQL (procedure 过程化sql) 在数据库内部操作数据的技术 proc/c++ ...
- hive的复合数据类型
hive中的复合数据类型 Array array中的数据为相同类型,例如,假如array A中元素['a','b','c'],则A[1]的值为'b' 数据结构如下: zhangsan beijing, ...
- C/C++知识总结 五 复合数据类型 壹(数组、字符串与string、结构)
C/C++复合数据类型 壹(数组.结构) 数组 数组的意义.定义与创建 一.二维数组应用 字符数组与字符串处理函数 数组与指针---关系密切 数组的意义与定义创建 意义:反映数据间的特点(通过把同一类 ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- Chisel3 - 复合数据类型
https://mp.weixin.qq.com/s/rXYqiZKuBpAYL8R94zxgRA Chisel允许用户根据需要,把基本数据类型组合成为复合数据类型使用.如C语言里面的结构体,这样 ...
随机推荐
- cesharp 完美支持flash
直接上代码: cefSettings.CefCommandLineArgs.Add("enable-npapi", "1"); //cefSettings.Ce ...
- Excel四象限散点图的制作方法
Excel中四象限散点图带文本数据标签,可以在散点图的基础上进行一些设置即可得到,无需第三方插件或者宏代码,非常方便,以office2013为例,效果如下: 步骤: 1.准备好数据源,选中两列数据源( ...
- ELK - logstash 多个配置文件及模板的使用
目录 - 前言 - 多配置文件的实现方式 - 为logstash 增加模板 - 将 logstash 作为服务启动 1. 前言 在使用 logstash 编写多个配置文件,写入到 elasticsea ...
- Swift编码总结3
1.编码转换: dataString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" re ...
- [转]windows 下 gcc/g++ 的安装
链接地址:https://www.jianshu.com/p/ff24a81f3637 不过下载地址直接进这里就可以了:https://sourceforge.net/projects/mingw/
- 【linux学习笔记七】关机重启命令
shutdown命令 shutdown [选项] 时间 #-c 取消前一个关机命令 #-h 关机(慎用远程关机) #-r 重启 其它关机命令 halt poweroff init 0 其它重启命令 ...
- [LeetCode] 489. Robot Room Cleaner 扫地机器人
Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...
- (C#)Application.Exit()、Environment.Exit(0)区别
Application.Exit:通知winform消息循环退出.会在所有前台线程退出后,退出应用 强行退出方式,就像 Win32 的 PostQuitMessage().它意味着放弃所有消息泵,展开 ...
- python基础篇(六)
PYTHON基础篇(六) 正则模块re A:正则表达式和re模块案例 B:re模块的内置方法 时间模块time A:时间模块的三种表示方式 B:时间模块的相互转换 随机数模块random A:随机数模 ...
- 2.Jvm 虚拟机栈和栈帧
Jvm 虚拟机栈和栈帧 1.栈帧(frames) 官网描述 A frame is used to store data and partial results, as well as to perfo ...