Go的100天之旅-06数组和Slice
数组
Go
的数组和其它语言基本上一样,是长度固定的特定类型元素组成的序列,这基本上是所有语言数组的特性。和其它语言相比差异主要在声明和初始化的写法上,下面是简单声明一个数组:
var a [5]int
fmt.Println(a[0])
fmt.Println(fmt.Println(a[len(a)-1]))
上面的a
是一个长度为5
的整数数组,如果没有给定初始值它里面的元素默认值是0
。Go
数组的下标是从0开始的,len
函数返回数组中元素的个数。我们可以在声明数组的时候初始化它的值:
var m [3]int = [3]int{1, 2, 3}
var n [3]int = [3]int{2, 3}
这里的m
和n
都是长度为3
的数组,m
对应的值是1, 2, 3
而由于n
初始化的时候只有2
个值,因此它里面的值是2, 3, 0
。
如果采用简单声明:=
的方式声明一个数组,可以指定数组的大小,也可以不指定大小这时它会根据初始化值的个数来确定:
a := [10]int{} //元素都为0
b := [...]int{1, 2} //长度为2
Go
也可以直接指定一个索引和值,来初始化,如果声明的时候长度不指定,那最大的索引加1
就是数组的长度:
a := [10]int{1:2} // 长度10,a[1] = 2 其它为0
b := [...]int{1:2, 10:1} //长度11,a[1] = 2 a[10] = 1其它为0
数组a
长度声明是10
,只给了索引1
的值为2
,其余都为0
。数组b
声明的时候索引1
为2
,10
为1
,它的长度是11
修改数组中某个索引的值方式和其它语言一样:
a := [10]int{}
a[0] = 10
数组的类型是由元素的类型和长度共同决定的,[3]int
和[4]int
是两种不同的数组类型。因此:
a := [3]int{1, 2, 3}
a = [4]int{1, 2, 3, 4}
编译的时候会报错,而:
a := [3]int{1, 2, 3}
a = [3]int{4, 5, 6}
是正确的
Slice
上面说的数组长度是固定,使用的时候不是很灵活,slice
的长度是可变,简单声明一个未初始化的slice
var a []int
print(len(a))
print(cap(a))
slice
也可以利用len
返回它的长度,刚才声明的slice
长度为0
。除了长度slice
还有一个容量cap
的概念,用cap
可以返回它的容量。长度不能超过它的容量。slice的声明也可以用make
,用make
声明可以指定容量和可以不指定容量,这时容量和长度一致:
a := make([]int, 10) //长度为10,容量为10
a := make([]int, 10, 12) //长度为10 容量为12
slice
可以进行切片操作slice[i:j]
,创建一个新的slice
,新的slice
范围是原来slice
下标i
到j-1
,也可以不指定下标slice[:j]
则是默认从0
到j-1
,同理如果slice[i:]
就是从i
到最后一个元素,下面是一个简单的例子:
a := []int {1, 2, 3, 4, 5}
b = a[1:2]
c = a[:2]
d = a[1:]
需要注意的是切片操作slice[i:j]
,j
可以大于slice
的长度,只要它小于容量
刚才一直讲到容量,那它到底有什么实际意义呢?开始slice
的时候说过它长度是可变的,哪怎么改变了?通过append
就可以对slice
追加元素,这时容量就有作用了,如果append的时候当前长度小于容量,那slice
不会扩大容量,也不会申请新的空间,而是在原来的基础上把长度加1
就行了,如果容量等于长度,则会扩容,扩容会申请新的空间。
package main
func main() {
a := make([]int, 10, 11)
a = append(a, 1)
println(len(a), cap(a)) // 11 11
a = append(a, 1)
println(len(a), cap(a)) // 12 12
}
Go的100天之旅-06数组和Slice的更多相关文章
- 假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 而已」
假设一个大小为100亿个数据的数组,该数组是从小到大排好序的,现在该数组分成若干段,每个段的数据长度小于20「也就是说:题目并没有说每段数据的size 相同,只是说每个段的 size < 20 ...
- go语言的 数组、slice、map使用(转)
golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...
- javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)
主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...
- Jsの练习-数组常用方法 -slice()
slice() 返回从原数组指定开始下标到结束下标之间的项组成的新数组. slice()方法可以接收一个或两个参数,即要返回项的起始和结束位置. 在只有一个参数的情况下,slice()方法返回从该参数 ...
- go递归函数如何传递数组切片slice
数组切片slice这个东西看起来很美好,真正用起来会发现有诸多的不爽. 第一,数组.数组切片混淆不清,使用方式完全一样,有时候一些特性又完全不一样,搞不清原理很容易误使用. 第二,数组切片的appen ...
- slice splice(数组) 和 slice substr substring split (字符串)的区别
array.slice(start,end)slice()如果不传入参数二,那么将从参数一的索引位置开始截取,一直到数组尾如果两个参数中的任何一个是负数,array.length会和它们相加 stri ...
- go基础之基本数据结构(数组、slice、map)
go基本的数据结构有数组.slice.map,高级数据结构为结构体为用户自定义类型.本片文章主要讲解三大基本数据结构. 数组 slice Map 数组 数组是包含单个类型的元素序列,但是长度固定的数据 ...
- 我的Vue之旅 06 超详细、仿 itch.io 主页设计(Mobile)
第二期 · 使用 Vue 3.1 + TypeScript + Router + Tailwind.css 仿 itch.io 平台主页. 我的主题 HapiGames 是仿 itch.io 的 in ...
- Java知识系统回顾整理01基础06数组03排序
一.选择法排序 选择法排序的思路: 把第一位和其他所有的进行比较,只要比第一位小的,就换到第一个位置来 比较完后,第一位就是最小的 然后再从第二位和剩余的其他所有进行比较,只要比第二位小,就换到第二个 ...
随机推荐
- 浅谈HTTPS和HTTP
1.HTTP和HTTPS的基本概念 HTTP:超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务端请求和应答的标准,用于WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览 ...
- Spring整合JDBC temple
一.Spring对Jdbc的支持 Spring为了提供对Jdbc的支持,在Jdbc API的基础上封装了一套实现,以此建立一个 JDBC 存取框架. 作为 Spring JDBC 框架的核心, JDB ...
- vc6.0代码转vs2017相关问题
vc6.0代码转vs2017相关问题 命令行 error D8016: “/ZI”和“/Gy-”命令行选项不兼容fatal error C1083: 无法打开包括文件: “WinSock2.h”: N ...
- Spring Boot 分离资源文件打包
Spring Boot项目默认的会打包成单一的jar文件,但是有时候我们并不想让配置文件.依赖包都跟可执行文件打包到一起.这时候可以在pom.xml文件中进行配置,从而使资源文件.依赖包和可执行文件分 ...
- 微信小程序-页面栈
在小程序中以栈的形式维护了当前的所有页面 当发生路由切换的时候,页面栈的表现如下: 初始化:新页面入栈 打开新页面:新页面入栈(调用 API wx.navigateTo 或使用组件 <navig ...
- 探索ADC的原理(自制3位并行比较型ADC)
摘要 本文通过列举历史中出现的产品,梳理了模数转换器在20世纪30年代~~20世纪80年代末的发展历史.接下来,简要介绍模数转换器的原理.技术指标.分类和未来发展方向.最后,提供了一种自制3位FLAS ...
- redis基础一
2.修改redis.conf的配置文件有两个地方 a.将daemonize设置成true支持后台启动 b.将redis的数据库文件保存到 下面的目录 3.启动redis服务器 4.操作redis ,给 ...
- Haproxy/LVS负载均衡实现+keepalived实现高可用
haproxy+keepalived 集群高可用集群转发 环境介绍 #内核版本 Ubuntu 18.04.4 LTS \n \l 107-Ubuntu SMP Thu Jun 4 11:27:52 U ...
- Spring IoC 循环依赖的处理
前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 是 ...
- ORACLE误删除表数据或误更新/插入数据如何恢复
工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料 PL/SQL 方法/步骤 首先新建一张测试表TEST,里面输入记录.由于删除/更 ...