Go: 复合数据类型slice
slice
slice 表示用于相同类型元素的可变长度的序列。
slice有三个属性:指针、长度和容量。
- 指针:slice存储数据的内部结构是数组,指针指向的是数组的地址
- 长度:保存slice中的元素数量
- 容量:slice中可容纳的元素数量,在像slice插入元素时,如果超过容量,会对slice进行扩容
slice的基本操作
1.初始化
// 方式一 通过字面量自己初始化
s := []int{}
months := []string{1: "January", /* ... */, 12: "December"}
var z []int
// 方式二 通过切片语法从数组或slice中生成
a := [10]int{1, 2, 3}
b := a[1: 3]
c := b[1:]
// 注意这种奇怪的方式,可以指定具体某个下标的值
e := []int{1:42, 55, 66, 77, 7:88}
fmt.Println(e) // [0 42 55 66 77 0 0 88]
2.访问和更改
// 访问和数组一致,通过下标访问
a := []int{1, 2, 3}
fmt.Println(a[1]) // 2
// 更改
a[1] = 100
fmt.Println(a[1]) // 100
b := a[:]
b[1] = 101 // b和a指向的底层数据一样的,所以b更改会影响a
fmt.Println(b[1], a[1]) // 101 101
3.增加
// 如果想对slice增加一个元素,使用append函数
a := []int{1, 2, 3}
a = append(a, 4)
fmt.Println(a) // [1 2 3 4]
// 使用len函数获取当前slice中元素数量
// 使用cap函数获取当前slice所能支撑的容颜
for i := 5; i < 15; i++ {
a = append(a, i)
fmt.Printf("len: %d\t cap: %d\n", len(a), cap(a))
}
/*OUTPUT:
[1 2 3 4]
len: 5 cap: 6
len: 6 cap: 6
len: 7 cap: 12
len: 8 cap: 12
len: 9 cap: 12
len: 10 cap: 12
len: 11 cap: 12
len: 12 cap: 12
len: 13 cap: 24
len: 14 cap: 24
*/
append函数会处理当当前slice对象的容量不足时,自动扩容(重新申请一块空间并将原来的元素复制过来)。我无法保证原始的slice和调用append后的结果slice执向同一个底层数组。也无法断定旧slice上对元素的操作会或者不会影响新的slice元素。所以通常我们将append的调用结果再次赋值给传入append函数的slice。
4.删除
// 通过copy实现删除
func remove(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
a := []{1, 2, 3}
a = remove(a, 1)
fmt.Println(a) // [1 3]
5.翻转slice
func reverse(s []int) {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
}
a := []int{1, 2, 3}
reverse(a)
fmt.Println(a) // [3 2 1]
6.比较
slice无法使用==进行比较,只允许和nil进行比较。如果想检查slice是否为空,使用len(s) == 0。
var s []int // len(s) == 0, s == nil
s = nil // len(s) == 0, s == nil
s = []int(nil) // len(s) == 0, s == nil
s = []int{} // len(s) == 0, s != nil
slice的用途
1.实现栈
栈的特点是先进后出
stack = []int{}
// 入栈
stack = append(stack, 1)
// 出栈
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
Go: 复合数据类型slice的更多相关文章
- Go数据类型之复合数据类型--Slice
3.2 Slice 一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象. 一个slice由三个部分构成:指针.长度和容量.指针指 ...
- [日常] 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语言里面的结构体,这样 ...
随机推荐
- 学习Git的基本业务逻辑
1,基本业务逻辑(假设针对index.html文件中内容): 1,在init版本库之前已写好开头部分:index 对index进行git init版本库: 进入到文件夹中,git init git a ...
- zookeeper与eureka比较
一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性) zookeeper确保cp 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接d ...
- selenium 鼠标,键盘操作
1.鼠标操作 导包:from selenium.webdriver.common.action_chains import ActionChains 1.context_click() ...
- python算法学习--待续
几个算法网站 算法可视化网站:https://visualgo.net/en,通过动画展示算法实现过程 程序可视化网站:http://www.pythontutor.com/visualize.htm ...
- Oracle常用SQL语句大全
常用Oracle数据库SQL语句汇总. 1.常用操作 --清空回收站purge recyclebin;--查询回收站select * from recyclebin--查询Oracle版本信息sele ...
- endnote x9.3.3 for windows安装教程
EndNote X9.3.3 是一款非常nice的实用型文献管理软件,EndNote X9功能极其强劲,便捷好用.本文提供EndNote X9.3.3安装破解激活教程.方法,内附EndNote x9. ...
- mysql查看当前连接数
show status like 'Threads%'; 需要root权限才能看到所有的连接
- linux signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)
SIGHUP /* hangup */ ~~~~~~ SIGHUP,hong up ,挂断.本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知 ...
- Python实现猜数字游戏
Python中实现猜数字游戏代码如下: import random # 引入随机数标准库-random # 定义数字上下限和最大游戏次数 min_num = 1 max_num = 10 guess_ ...
- springboot集成swagger的pom依赖
pom依赖加入以下内容 //版本一致做个属性 <properties> <swagger.version>2.6.1</swagger.version> </ ...