Go语言之数组/Slice篇

来自公众号:灰子学技术

一、数组的语法介绍

Go中的数组与C++中的数组含义并无不同,表示的都是具有相同唯一数据类型的一组已经编号并且长度固定的数组项序列。

```

var varName [SIZE]type // 备注:该格式是声明格式,变量名 + 数组大小 + 数据类型

```

数组初始化:

数组的初始化基本上是以下例子中的几种格式

 

package main	
import (	
"fmt"	
)	
func main() {	
        var name0s [2]string = [2]string{"hello","shanghai"}	
        var names = [...]string{"hello", "world"}	
        var name1s = [5]string{"hello", "the", "world"}	
        name2s := []string{"hello","go","language"}	
        fmt.Println(name0s, names, name1s, name2s)	
        return	
}	

	

	
output:	

	

	
[hello shanghai] [hello world] [hello the world ] [hello go language]	

 

二、Slice的语法介绍

Go语言里面提到数组,就避不开slice,在介绍slice之前,我们需要先看下slice与数组之间的关系。

1.slice是数组的抽象。

2.数组的长度是固定的,但是slice的长度是可变的。

Go语言中的slice与C++中的vector是很类似的。

Go中的slice初始化有下面几种方式:

var silceName []type	
var sliceName []type = make([]type, len)	
silceName := make([]type, len)	
sliceName := make([]type, len, capactity) // len表示的是slice的长度,capacity表示的是slice的容量大小,也就是说,当len<capacity的时候,slice不会重新申请内存空间,len>capacity   的时候,会重新申请一个内存空间。	
slice := []int{1,2,3} // 直接将slice初始化,其中slice[0]=1,slice[0]=2,slice[0]=3,len = capacity = 3	

 

例子如下:

640?wx_fmt=png

Output:

640?wx_fmt=png

在使用slice的时候,如果采用下标的方式,一旦超过了capacity的话,会提示 越界错误。

640?wx_fmt=png

append的使用会导致,slice的append扩充,扩充规则为:

1.如果新的大小是当前大小的2倍以上,则大小增长为新大小

2.否则循环一下操作:如果当前大小小于1024,按每次2倍增长,否则每次按当前大小的 1/4 增长。直达增长的大小超过或等于新大小。

例子为:

640?wx_fmt=png

640?wx_fmt=png

备注:在使用slice的时候,往往会因为slice的capacity的大小不确定,而采用“下标”的方式添加,此种方式存在数组越界的风险,但是采用append可以自动扩展capacity的大小,所以笔者建议给slice新增元素的时候,尽量采用append的方式。

三、C++的vector的介绍

1.是封装动态数组的顺序容器。

2.vector 的存储是自动管理的,按需扩张收缩。vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。

3.标准库提供 std::vector 对类型 bool 的特化,它可能为空间效率优化。vector<bool>节省空间的动态 bitset

常用函数如下所示:

640?wx_fmt=png

参数:https://zh.cppreference.com/w/cpp/container/vector

 

640?wx_fmt=png

参考:https://zh.cppreference.com/w/cpp/container/vector

 


灰子作于二零一九年八月十一日。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值