博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四章-go中的数组和切片
阅读量:2197 次
发布时间:2019-05-02

本文共 1697 字,大约阅读时间需要 5 分钟。

前言

提到数组可能大家知道,但是切片又是什么东西呢?切片对应的英语单词是slice,如果有了解过Python的朋友可能会对切片有种焕然大悟的感觉。而如果要在Java中找到个类似的数据结构,那就是ArrayList

简单来说切片slice可以看做是一个动态长度的数组,它的底层是一个数组,不过它可以通过重建一个数组达到扩容的目的。

下面会分别介绍数组和切片

数组

go中的数组是很常见的定长数组,数组的长度在声明时需要确定。

声明数组

数组声明的语法很简单,使用var声明即可

var a [3] int // 数组声明方式 var 数组名 [数组长度] 数据类型

数组中的元素未初始化时,则为对应类型的默认值。当然也可以使用:=来声明数组

a := [3] int {} // 数组声明方式  数组名 := [数组长度] 数据类型 {}

需要注意数组声明时,需要在声明时指定数组的长度。也可以通过初始化数组中每个元素来指定数组长度

a := [] int {1,2,3}

除了一维数组以外,也支持多维数组,下面将演示二维数组声明

a := [3] [3] int {}

访问数组

数组可以通过下标索引访问数组中特定位置的元素,需要注意索引是从0开始的。

package mainimport "fmt"func main() {	a := [] int {1,2,3}	fmt.Println(a[0])}

上面例子的运行结果为1,当然也可以使用for(后续会详细介绍)遍历数组元素

package mainimport "fmt"func main() {	a := [] int {1,2,3}	for i:=0;i

上面例子的中使用len(a)获取数组长度,运行结果如下

123

切片

切片是对数组部分元素(也可是全部元素)的引用,为什么需要切片呢?因为数组是值类型,赋值和传参会复制整个数组。而使用切片则不需要复制整个数组。

切片声明

切片既可以在一个数组基础上声明,也可以直接声明(会自动创建引用的数组)

下面会演示怎么基于数组声明切片

arr := [] int {1,2,3,4,5}  // 声明数组slice := arr[0:3:5] //切片声明 切片名 := 数组名[最左索引left:最右索引right:切片最大长度max]

需要注意的是最左索引left、最右索引right和切片最大长度max都可以省略,例如这样

slice := arr[:] // 等价于引用整个原数组

直接声明切片时需要用到展开符号...

slice := [...] int {1,2,3}

也可以使用make创建一个元素未初始化的切面

slice := make([]int, 5) // 声明了一个长度为6的切片

切片使用

前文提到切片可以作为一个动态长度的数组使用(切片遍历方式与数组一致),那么切片是在什么时候会触发引用的数组扩容(替换新的数组)呢?

这个就需要提到slice中的一个内置属性cap,这个属性就是扩容阈值,切片长度大于这个阈值时,自动重新分配新底层数组,下面将会用一个例子演示切片如何动态扩容

package mainimport "fmt"func main() {	slice := make([]int, 5) // 声明一个长度和扩容阈值为5的切片	fmt.Println("length:",len(slice)) // 输出切片长度	fmt.Println("cap:",cap(slice)) // 输出切片的扩容阈值	slice =append(slice,6) // 切片增加一个元素6	fmt.Println("newLength:",len(slice)) // 输出切片新长度	fmt.Println("newCap:",cap(slice)) // 输出切片新的扩容阈值}

运行结果

length: 5cap: 5newLength: 6newCap: 10

从运行结果可以得知,切片的阈值增长策略为当新长度大于阈值时,新阈值为原阈值的2

转载地址:http://sgoub.baihongyu.com/

你可能感兴趣的文章
GridView+存储过程实现'真分页'
查看>>
flask_migrate
查看>>
解决activemq多消费者并发处理
查看>>
UDP连接和TCP连接的异同
查看>>
hibernate 时间段查询
查看>>
java操作cookie 实现两周内自动登录
查看>>
Tomcat 7优化前及优化后的性能对比
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>